我知道这样做:
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()
}
使用then
/回调?
更新:
@Bergi在这个答案中是正确的,这是顺序发生的。要共享一个很好的解决方案,让对象同时工作而不必将数组中的对象拼凑在一起,也可以使用Bluebird
,如下所示
const obj2 = Bluebird.props(obj)
答案 0 :(得分:7)
不,每个await
都会停止执行,直到承诺完成,甚至是中间表达。它们是否碰巧属于同一声明并不重要。
如果要并行运行它们,并且只等待一次结果,则必须使用await Promise.all(…)
。在你的情况下,你要写
const [result1, result2] = await Promise.all([a(), b()]);
const obj = {result1, result2};
您如何使用
then
/ callbacks来表示对象分配?
为每个等待值提供临时变量。每个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 …
});
})
答案 1 :(得分:1)
执行a()和b()并发运行吗?
不,他们按顺序运行。
等价物就像是
Public Function StrOut(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Pattern = "(\d*\.)?\dm"
If .Test(strIn) Then
StrOut = InStr(strIn, .Execute(strIn)(0))
Else
StrOut = "not found"
End If
End With
End Function