12

我知道这样做:

const resultA = await a()
const resultB = await b()
// code here

有效地

a().then( resultA => {
   b().then( resultB => {
      // code here
   })
})

基本上,a() 运行然后b() 运行。我嵌套它们以表明 resultA 和 resultB 都在我们的范围内;但是这两个功能都没有立即运行。

但是这个呢:

const obj = {
  result1: await a(),
  result2: await b()
}

a() 和 b() 是否同时运行?

以供参考:

const asyncFunc = async (func) => await func.call()
const results = [funcA,funcB].map( asyncFunc )

我知道这里funcAfuncB同时运行。

奖金

您将如何表示对象分配

const obj = {
  result1: await a(),
  result2: await b()
}

使用then/ 回调?


更新:

@Bergi 在这个答案中是正确的,这是按顺序发生的。为了共享一个很好的解决方案,让一个对象同时进行这项工作,而不必将数组中的对象拼凑在一起,也可以使用Bluebird如下

const obj2 = Bluebird.props(obj)

http://bluebirdjs.com/docs/api/promise.props.html

4

2 回答 2

13

不,每个await人都会停止执行,直到承诺完成,即使是在表达中。它们是否恰好是同一语句的一部分并不重要。

如果你想并行运行它们,并且只等待一次它们的结果,你必须使用await Promise.all(…). 在你的情况下,你会写

const [result1, result2] = await Promise.all([a(), b()]);
const obj = {result1, result2};

您将如何使用then/ 回调来表示对象分配?

每个等待值都有临时变量。每个都await转化为一个then电话:

a().then(tmp1 => {
  return b().then(tmp2 => {
    const obj = {
      result1: tmp1,
      result2: tmp2
    };
    return …
  });
})

如果我们想学究气,我们就必须拆开对象创建:

const tmp0 = {};
a().then(tmp1 => {
  tmp0.result1 = tmp1;
  return b().then(tmp2 => {
    tmp0.result2 = tmp2;
    const obj = tmp0;
    return …
  });
})
于 2017-05-18T02:41:57.663 回答
1

a() 和 b() 是否同时运行?

不,它们按顺序运行。

相当于

a()
.then(result1 => b())
  .then(result2 => ({result1, result2}))
于 2017-05-18T02:40:19.470 回答