Async / await assignment to object keys: is it concurrent?

有些话、适合烂在心里 提交于 2019-11-30 09:12:54

问题


I know that doing this:

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

Is effectively

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

Basically, a() runs then b() runs. I nested them to show that both resultA and resultB are in our scope; yet both function didn't run at once.

But what about this:

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

do a() and b() run concurrently?

For reference:

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

I know here funcA and funcB do run concurrently.

Bonus:

How would you represent the object assignment

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

using then / callbacks?


UPDATE:

@Bergi is correct in this answer, this occurs sequentially. To share a nice solution for having this work concurrently for an object without having to piece together the object from an array, one can also use Bluebird as follows

const obj2 = Bluebird.props(obj)

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


回答1:


No, every await will stop the execution until the promise has fulfilled, even mid-expression. It doesn't matter whether they happen to be part of the same statement or not.

If you want to run them in parallel, and wait only once for their result, you have to use await Promise.all(…). In your case you'd write

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

How would you represent the object assignment using then / callbacks?

With temporary variables for each awaited value. Every await translates into one then call:

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

If we wanted to be pedantic, we'd have to pick apart the object creation:

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



回答2:


do a() and b() run concurrently?

No, they run sequentially.

The equivalent would be something like

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


来源:https://stackoverflow.com/questions/44037598/async-await-assignment-to-object-keys-is-it-concurrent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!