babels async
/ await
代码是否足够智能以查看以下代码:
async function alpha () {
let resultOne = await processNumber(5)
let resultTwo = await processNumber(5 + 8)
let resultThree = await processNumber(resultOne.number)
let resultFour = await processNumber(resultOne.number + resultThree.number)
return resultFour
}
如下所示,此函数中的前两个promise可以一起发生,因为执行这些操作所需的值不需要等待任何事情。
import Promise from 'bluebird'
async function beta () {
let {resultOne, resultTwo} = await Promise.props({
resultOne: processNumber(5),
resultTwo: processNumber(5 + 8)
})
let resultThree = await processNumber(resultOne.number)
let resultFour = await processNumber(resultOne.number + resultThree.number)
return resultFour
}
我会理解alpha
函数在等待每个异步函数调用进入下一个函数之前,beta
resultOne
和resultTwo
同时发生,这是唯一可能的,因为他们不需要等待任何其他电话。我想知道这是不是真的如此,或者如果巴贝尔在幕后做了些什么来将这些捆绑在一起。
答案 0 :(得分:0)
我在两者之间设置了一个基准,似乎它没有考虑到它自己。
以下是测试:
thomasreggi@zx:PAS-api$ babel-node test.js
{ number: 22 }
test alpha: 2025ms
{ number: 22 }
test beta: 1508ms
true
thomasreggi@zx:PAS-api$ babel-node test.js
{ number: 22 }
test alpha: 2033ms
{ number: 22 }
test beta: 1511ms
true
结果如下:
INPUT__FILE__NAME
答案 1 :(得分:0)
在JS中,几乎不可能做出任何严格的陈述,无论给定的表达是否是无关的#34;到另一个任意表达式(特别是静态)。
之所以发生这种情况,是因为由于其高度动态性,几乎每个表达式都可能导致隐藏(或不那么隐藏)的副作用,这可能会破坏程序的预期流程。
对于你的代码,如果两个"无关"非常容易打破代码。呼叫被触发"同时":
let isFirst = true;
async function processNumber(v) {
await Promise.delay(2000 - v * 100);
if (v < 10) {
if (!isFirst) {
throw new Error();
}
}
isFirst = false;
return { number: v + 3 };
}
这适用于alpha
,但适用于beta
。
如果你知道它会很好并且想要运行它们并且#34;并行&#34;只需相应地使用await
:
async function alpha () {
let one = processNumber(5)
let two = processNumber(5 + 8)
const resultOne = await one;
let resultThree = await processNumber(resultOne.number)
let resultFour = await processNumber(resultOne.number + resultThree.number)
return resultFour
}
另请注意,resultTwo
未在代码中的任何位置使用。