2017-10-23 13 views
0

これら2つのコードスニペットの出力が異なるのはなぜですか?最初のものでは、私がコンソールアウトするとき、私は約束を待っている(私は実際の値をしたいとき)。ES6 Javascript非同期関数の解決された値を正しく待つ方法はありますか?

(() => { 
    let message = { 
    actions: [{}] 
    }; 
    message.actions = message.actions.map(async action => { 
    action.result = {}; 
    action.result.startAt = await "whatever"; 
    return action; 
    }); 

    console.log(message); 
})(); 

そして、この第二のコードスニペットでは、私が実際に解決された値を取得...

(async() => { 
    let message = { 
    actions: [{}] 
    };                         
    message.actions[0].result = {}; 
    message.actions[0].result.startAt = await "whatever"; 

    console.log(message); 
})(); 
+0

非同期関数は約束を返すされ、その解決の値が 'それから()'コールバックでご利用いただけます。だから、あなたの最初のスニペットはただの約束をしているだけです。 2番目のスニペットは、非同期関数の結果を記録するのではなく、単に非同期関数内にオブジェクトを記録することです。 –

+0

'async'は最初の例では使用されていません – guest271314

+0

そうですが、解決された値を完全に待つためにconsole.logを取得するにはどうすればよいですか?私の実際のコードでは、console.logはSNSキューへのプッシュであり、値として "Pending Promise"を取得します。 – pjb

答えて

1

手順は、message.actionsの各要素を待つPromise.all()forループを使用することができ、非同期の場合Promise値を返す

(async() => { 
 
    let message = { 
 
    actions: [{}] 
 
    }; 
 
    message.actions = await Promise.all(message.actions.map(async(action) => { 
 
    action.result = {}; 
 
    action.result.startAt = await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 1000), "whatever")); 
 
    return action; 
 
    })); 
 

 
    console.log(message); 
 
})();

1

最初のケース:

非同期タスクを開始し、タスクの値を要求するのを待たずに(理由は不明)。

第二の場合:

あなたが構造を記入し、それが動作しますので、すぐにそれを印刷。実行時に

はまだawait "whatever";だけ"whatever"

関連する問題