Javascript 对象键的异步/等待分配:是并发的吗?

Javascript 对象键的异步/等待分配:是并发的吗?,javascript,async-await,es6-promise,ecmascript-2017,Javascript,Async Await,Es6 Promise,Ecmascript 2017,我知道这样做: const resultA = await a() const resultB = await b() // code here 有效地 a().then( resultA => { b().then( resultB => { // code here }) }) 基本上,a()运行,然后b()运行。我嵌套了它们以显示resultA和resultB都在我们的范围内;但这两个函数并没有同时运行 但是这个呢: const obj = {

我知道这样做:

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 )
我知道这里的
funcA
funcB
是同时运行的

奖金

您将如何表示对象分配

const obj = {
  result1: await a(),
  result2: await b()
}
使用
然后
/回调


更新:

@Bergi的回答是正确的,这是顺序发生的。要共享一个很好的解决方案,使它能够同时为一个对象工作,而不必从数组中拼凑对象,还可以使用
Bluebird
,如下所示

const obj2 = Bluebird.props(obj)

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

不,它们是按顺序运行的

等价物应该是

a()
.then(result1 => b())
  .then(result2 => ({result1, result2}))

不,每个
wait
都将停止执行,直到承诺实现为止,即使是在表达式中间。它们是否恰好是同一声明的一部分并不重要

如果要并行运行它们,并且只等待一次结果,则必须使用
wait Promise.all(…)
。如果是你的话,你会写信的

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

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

为每个等待的值使用临时变量。每个
等待
转换为一个
然后
呼叫:

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 …
  });
})

您的“for reference”示例有一个语法错误(因此具有误导性)。如果使用
await
,则必须使箭头函数
async
,然后很明显,它们可能会并发运行,因为它们是单独的函数求值。感谢您捕捉到这一点,更正了。请注意,JS函数可能会触发并发运行的异步进程,但是JS函数本身并没有在多线程同时执行的意义上并发运行。你说得对!我刚刚编写完测试代码,使用setTimeout尝试上面的代码,它确实是按顺序运行的。