2017-05-02 5 views
0

私は以下のコードスニペットを持っています。それはpromise変数を定義する関数fn1を持っています。 promiseは、約束オブジェクト返信をfn2で返します。そのpromiseオブジェクトにthenを呼び出し、最後にpromiseを返します。 thenブランチは非同期コードがあるので、内部関数は外側の関数も非同期ように動作します非同期(async)であるとき"then"ブランチの後にmain関数の約束変数を返します。

function fn1() { 
    var promise = fn2(a, b); 
    promise.then(function() { 
     console.log('handling then'); 
     console.log('doing something'); 
    }); 
    return promise; 
} 

は、私の理解です。しかし、問題はpromiseオブジェクトがthen内のコードが完了する前に返されることです。

promiseオブジェクトをthen以下に返そうとしました。しかし、promisefn1の内部に返されません。

function fn1() { 
    var promise = fn2(a, b); 
    promise.then(function() { 
     console.log('handling then'); 
     console.log('doing something'); 
     return promise; 
    }); 
} 

どうすれば解決できますか。ありがとうございました。

function fn1() { 
    var promise = fn2(a, b); 
    return promise 
} 

fn1().then(function() { 
    console.log('handling then'); 
    console.log('doing something'); 
}); 

それともこれを行うことができます:

+0

あなたは何を達成しようとしていますか?あなたは間違ったアプローチをとっているかもしれません(非同期呼び出しが本当に役に立たないと 'return'が本当に役に立ちません)。 – Hodrobond

+0

@Hodrobond - 別のコードがこの約束オブジェクトを使って何か他のことをしているので、返される約束オブジェクトが必要です。これを行うための回避策は何ですか? – Harish

答えて

0

あなたはこれをしたい

fn2(a, b).then(() => { /* do something */ }) 
0

しかし、問題は内部のコードが、その後完了する前に約束のオブジェクトが返されます。

あなたのコンセプトには欠陥があります。非同期はではなく、ブロック実行です。約束は、保留中の操作を表すオブジェクトです。その操作が完了したかどうかを知るために保持しているものです。あなたはコールバックをアポイントメントに添付して、それがあったかどうかを知ることができます。

fn2が完了したかどうかは、fn1で完了し、途中で処理しているように見えます。

function fn1() { 
    return fn2(a, b).then(function() { 
     console.log('handling then'); 
     console.log('doing something'); 
    }); 
} 

fn1.then(function(){ 
    // fn2 completed, fn1 completed handling 
}); 
関連する問題