假设我具有以下异步功能。 console.log
仅在解决后才会触发。
(async () => {
await new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000);
});
console.log('resolved');
})();
这是有效的JavaScript吗?还是应该始终使用.then()
?与在这里使用.then()
相比,缺点或行为有何不同?
(async () => {
return await new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000);
});
})().then(() => {
console.log('resolved');
});
离题:我还注意到最新的方法return await
可以更改为return
而结果不变,但是this thread回答了这个问题。
答案 0 :(得分:3)
then
的要点是能够在不总是诉诸async/await
的情况下处理异步操作。第一个例子是完全有效的。
第二个有点像反模式,因为没有async/await
,它在功能上是相同的,这有两个原因-用async
标记函数会隐式地使它返回Promise,但您也会显式返回一个-await
和Promise一起执行会使代码等待直到Promise解析之后才返回它,但是由于您与then
链接,因此then
不会在Promise解析之前运行无论如何。
这在功能上是相同的:
(() => {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000);
});
})().then(() => {
console.log('resolved');
});
像第一个示例一样,使用“类似同步”的代码的主要缺点是错误处理-如果您连续执行5个await
操作,但其中任何一个拒绝,则整个async
函数都会返回被拒绝的承诺。如果链接then
操作,也可以插入catch
处理程序以更精确地处理特定的错误情况。