当babel处理async / await代码时,它会捆绑不相关的调用
When babel processes async / await code does it bundle unrelated calls?
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
}
如下所示,其中函数中的前两个承诺可以同时发生,因为执行这些操作所需的值不需要等待任何东西。
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
同时发生的地方,这是唯一可能的,因为它们不需要等待任何其他调用。我想知道这是否真的是这样,或者babel是否在幕后做了一些事情将这些捆绑在一起。
我在两者之间设置了一个基准,似乎它本身并没有考虑到这一点。
下面是测试:
import Promise from 'bluebird'
async function processNumber (int) {
await Promise.delay(500)
return {number: int + 3}
}
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
}
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
}
async function main () {
const TEST_ALPHA = 'test alpha'
const TEST_BETA = 'test beta'
console.time(TEST_ALPHA)
let resultAlpha = await alpha()
console.log(resultAlpha)
console.timeEnd(TEST_ALPHA)
console.time(TEST_BETA)
let resultBeta = await beta()
console.log(resultBeta)
console.timeEnd(TEST_BETA)
return true
}
main()
.then(console.log)
.catch(console.error)
结果如下:
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
在JS中,几乎不可能做出任何严格的声明,无论给定表达式是否与另一个任意表达式"无关"(特别是静态)。
发生这种情况的原因是由于其高度动态的性质,几乎每个表达式都可能导致隐藏的(或不那么隐藏的)副作用,从而可能破坏程序的预期流程。
对于你的代码来说,如果两个"不相关"的调用"同时"触发,那么很容易破坏代码:
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
无效。
如果你知道它会很好,并且想要"并行"运行它们,只需使用相应的await
s:
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
不能在代码的任何地方使用。
相关文章:
- 在React中,为什么我必须绑定onClick函数而不是调用它
- 回调函数(如afterMove)不被调用
- 在firefox中,使用jquery ajax不会调用错误和完整回调
- 单击“角度”复选框时更新不相关的字段
- 当“不相关”的 html 选择元素没有选择任何选项时,如何退出 jQuery 事件
- JavaScript函数有时被调用,有时不被调用
- $.post到PHP文件-在包含循环完成之前不会调用回调
- 如果我传递一个参数,则不会调用javascript函数
- 自定义角度过滤器提供TypeError.不能调用undefined,但变量已定义并有效
- 单击不相关的按钮时,PostBack OnTextChanged将触发
- 在使用Protractor进行测试时,我可以用json文件替换结果,而不是调用实际的REST端点
- 在简单模式中,取消单击时不会调用onClose事件..当我在simple-modal上加载另一个jquery对话框时
- 不能调用未定义节点.js的方法“forEach”
- 不能调用方法
- Ajax 调用重新加载页面,而不是调用回调函数
- 函数在不被调用的情况下不断重置自身
- js 不能调用函数名权限
- 如何让两个不相关的 React 组件一起工作
- 在 ng 单击不部分调用控制器功能时遇到困难
- 当babel处理async / await代码时,它会捆绑不相关的调用