【问题标题】:Where to put await?在哪里等待?
【发布时间】:2018-03-24 09:52:10
【问题描述】:

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

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

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 放在实际需要的地方会更清楚,而不是因为后面的代码需要而预先等待。

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

【问题讨论】:

    标签: javascript node.js asynchronous io


    【解决方案1】:

    你完全正确。在较大的代码段中,放置 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 完成。

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      相关资源
      最近更新 更多