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尝试上面的代码,它确实是按顺序运行的。