我想了解是否有等待异步操作的正确答案。如果这是一个有深度的主题,我也很高兴收到文章或编程术语来阅读。
假设我们有一个缓慢的异步操作,可能是读取一个大文件:
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);
}
假定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
完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句