在哪里放置等待?

乔恩·劳瑞森

我想了解是否有等待异步操作的正确答案。如果这是一个有深度的主题,我也很高兴收到文章或编程术语来阅读。

假设我们有一个缓慢的异步操作,可能是读取一个大文件:

const resolver = (x) => {
  return new Promise(resolve => {
    setTimeout(() => {resolve(x)}, 500)
  })
}

我可以看到两种使用方法resolver

const one = async () => {
  const result = await resolver('foo')
  console.log(result)
}

const two = async () => {
  const result = resolver('foo')
  console.log(await result)
}

(注意不同位置的await关键字)

one我们立即等待,这就是我接触过的模式。我认为这是正常和预期的模式?

但是那条线真的应该等待结果吗?它并不真正需要解决的,对不对?result仅在下一行真正消耗.. 那么为什么不等待,如图two所示?

对于这个简单的例子,显然没有任何清晰度的提高,但是在具有多个等待和异步结果的多个使用者的更大函数中,我可能会看到将await共同定位在实际需要的地方会更清晰,而不是预先等待只是因为后面的代码需要它。

有正确答案吗?还是想法?如果这完全是对担心的巨大浪费,那么我也很高兴得知这一点:)

斯莱贝特曼

你是绝对正确的。在较大的代码段中,放置 await 的位置很重要。

以下是两种风格如何导致完全不同解释的示例:

// Example 1 - serial async operations

async function () {
    var a = await foo();
    var b = await bar();

    console.log(a+b);
}

假定foobar每个需要一秒钟到返回的结果,上面的代码将需要大约两秒钟执行。

// Example 2 - parallel async operations

async function () {
    var a = foo();
    var b = bar();

    var aa = await a;
    var bb = await b;
    console.log(aa+bb);
}

做出与第一个示例相同的假设,上面的代码大约需要一秒钟才能执行,因为bar将并行执行而无需等待foo完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章