如何正确等待ES6 Javascript异步函数的解析值?

时间:2017-10-23 01:34:07

标签: javascript async-await

为什么这两个代码段的输出方式不同?在第一个,当我控制台时,我得到待处理的Promises(当我想要实际值时)。

(() => {
  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);
})(); 

2 个答案:

答案 0 :(得分:1)

如果该过程是异步的,您可以使用Promise.all()for循环等待message.actions的每个元素返回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 :(得分:1)

第一种情况:

您启动了异步任务,无需等待任务完成请求任务的值(不确定原因)。

第二种情况:

您填写结构并立即打印,以便它可以正常工作。

await "whatever";只是"whatever"