async/await
和promises密切相关。 async
函数返回promises,而await是用于等待promise被解决的语法糖。
混合使用promises和async
函数可能唯一的缺点是代码的可读性和可维护性,但你可以将async函数的返回值视为promise以及对返回promise的常规函数使用await
。
您选择其中一个的大部分取决于可用性(您的node.js /浏览器是否支持async
?)和美学偏好,但根据我的建议(基于我写作时的偏好),一个好的经验法则可能是:
如果您需要按顺序运行异步代码:请考虑使用async/await
:
return asyncFunction()
.then(result => f1(result))
.then(result2 => f2(result2));
对比
const result = await asyncFunction();
const result2 = await f1(result);
return await f2(result2);
如果你需要嵌套的 Promises:使用 async/await
:
return asyncFunction()
.then(result => {
return f1(result)
.then(result2 => f2(result, result2);
})
对比
const result = await asyncFunction();
const result2 = await f1(result);
return await f2(result, result2);
如果需要并行运行: 使用Promise。
return Promise.all(arrayOfIDs.map(id => asyncFn(id)))
有人建议可以在表达式中使用 await
来等待多个任务,例如:
*注意,这仍按顺序从左到右等待,如果您不期望出现错误,这是可以的。否则,由于 Promise.all() 的快速失败行为 ,行为将不同。
const [r1, r2, r3] = [await task1, await task2, await task3];
(async function() {
function t1(t) {
console.time(`task ${t}`);
console.log(`start task ${t}`);
return new Promise((resolve, reject) => {
setTimeout(() => {
console.timeEnd(`task ${t}`);
resolve();
}, t);
})
}
console.log('Create Promises');
const task1 = t1(100);
const task2 = t1(200);
const task3 = t1(10);
console.log('Await for each task');
const [r1, r2, r3] = [await task1, await task2, await task3];
console.log('Done');
}())
但是,就像使用Promise.all
一样,在出现错误时需要正确处理并行的 Promise。您可以在这里阅读更多相关内容。
请注意,不要将上述代码与以下代码混淆:
let [r1, r2] = [await t1(100), await t2(200)];
function t1(t) {
console.time(`task ${t}`);
console.log(`start task ${t}`);
return new Promise((resolve, reject) => {
setTimeout(() => {
console.timeEnd(`task ${t}`);
resolve();
}, t);
})
}
console.log('Promise');
Promise.all([t1(100), t1(200), t1(10)]).then(async() => {
console.log('Await');
let [r1, r2, r3] = [await t1(100), await t1(200), await t1(10)]
});
使用这两种方法并不等同。了解更多区别。
最终,Promise.all
是一种更干净、适用于任意数量任务的扩展性更好的方法。
async/await
只能与 promises 一起使用,因此不存在async/await
或 promises 的选择,只有async/await
和 promises 的结合。因此,你真正需要问的是是否只使用普通的 promises,还是使用带有async/await
的 promises。 - jfriend00async / await
与promise有关系,因此,按照字面意义问问题是误导性的。await
语句等待promise被满足。你真正想知道的是使用await
和then()
方法的区别。简短回答是它们大部分的工作都相同,所以这主要取决于个人喜好。 - Manngo