如果babel处理异步/等待代码,它会捆绑不相关的调用吗?

时间:2016-11-15 21:11:57

标签: javascript async-await babel

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 resultOneresultTwo同时发生,这是唯一可能的,因为他们不需要等待任何其他电话。我想知道这是不是真的如此,或者如果巴贝尔在幕后做了些什么来将这些捆绑在一起。

2 个答案:

答案 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未在代码中的任何位置使用。