我想了解是否有正确答案可以等待异步操作。如果这是一个有深度的主题,我也很高兴收到文章或编程术语来阅读。
假设我们有一个缓慢的异步操作,也许是读取一个大文件:
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
放置在哪里更清楚实际上是必需的,而不是仅仅因为后来的代码需要它而提前等待。
任何正确的答案?还是想法?如果这是一个巨大的浪费,那么我也很高兴了解到这一点:)
答案 0 :(得分:1)
你是绝对正确的。在更大的代码中,您需要等待的事情。
以下是两种风格如何导致完全不同的解释的示例:
// Example 1 - serial async operations
async function () {
var a = await foo();
var b = await bar();
console.log(a+b);
}
假设foo
和bar
每个都需要一秒钟才能返回结果,上面的代码大约需要两秒钟才能执行。
// 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
完成。