async await Promise resolve 是否需要调用 .then()?
Does an async await Promise resolve require .then() to be called?
假设我有以下异步函数。 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
而不改变结果,但是回答了那个问题。
能够处理异步操作而不总是求助于then
是async/await
的要点。第一个例子完全有效。
第二个有点反模式,因为它在没有 async/await
的情况下在功能上是相同的,原因有二——用 async
标记你的函数隐含地使它成为 return 一个 Promise ,但您还明确 return 一个 - 并且 await
ing Promise 导致代码在 returning 之前等待 Promise 解决,但由于您正在链接 then
, then
不会 运行 在 Promise 解决之前。
这在功能上是相同的:
(() => {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000);
});
})().then(() => {
console.log('resolved');
});
像第一个示例那样使用 "synchronous-like" 代码的主要缺点是错误处理 - 如果您连续执行 5 个 await
操作并且其中任何一个被拒绝,您的整个 async
函数 return 是一个被拒绝的 Promise。如果您链接 then
个操作,您还可以插入 catch
个处理程序来更精确地处理特定的错误情况。
假设我有以下异步函数。 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
而不改变结果,但是
能够处理异步操作而不总是求助于then
是async/await
的要点。第一个例子完全有效。
第二个有点反模式,因为它在没有 async/await
的情况下在功能上是相同的,原因有二——用 async
标记你的函数隐含地使它成为 return 一个 Promise ,但您还明确 return 一个 - 并且 await
ing Promise 导致代码在 returning 之前等待 Promise 解决,但由于您正在链接 then
, then
不会 运行 在 Promise 解决之前。
这在功能上是相同的:
(() => {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000);
});
})().then(() => {
console.log('resolved');
});
像第一个示例那样使用 "synchronous-like" 代码的主要缺点是错误处理 - 如果您连续执行 5 个 await
操作并且其中任何一个被拒绝,您的整个 async
函数 return 是一个被拒绝的 Promise。如果您链接 then
个操作,您还可以插入 catch
个处理程序来更精确地处理特定的错误情况。