在哪里等待?

时间:2018-03-24 09:52:11

标签: javascript node.js asynchronous io

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

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

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放置在哪里更清楚实际上是必需的,而不是仅仅因为后来的代码需要它而提前等待。

任何正确的答案?还是想法?如果这是一个巨大的浪费,那么我也很高兴了解到这一点:)

1 个答案:

答案 0 :(得分:1)

你是绝对正确的。在更大的代码中,您需要等待的事情。

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

// 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完成。