javascript - async await Promise resolve 是否需要调用 .then() ?
问题描述
假设我有以下异步功能。只有在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
隐式标记你的函数使它返回一个 Promise,但你也显式返回一个 - 并且await
ing Promise 导致代码等到Promise 在返回它之前解决,但是由于您与 链接then
,因此then
在 Promise 解决之前不会运行。
这在功能上是相同的:
(() => {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000);
});
})().then(() => {
console.log('resolved');
});
像第一个示例一样使用“类同步”代码的主要缺点是错误处理 - 如果您await
连续执行 5 个操作并且其中任何一个操作被拒绝,您的整个async
函数都会返回一个被拒绝的 Promise。如果您链接then
操作,您还可以插入catch
处理程序以更精确地处理特定的错误情况。
推荐阅读
- r - 如何编辑自己的 k-means 函数,以便将簇作为输入而不是 R 中的中心?
- c++ - 对时间复杂度与哈希映射的混淆
- google-cloud-platform - GKE Secrets 或 Google 机密管理器
- python - 获取具有特定角色 discord bot 的所有成员的列表
- php - 获取 Facebook 图片 URL
- tfs - Tfs 工作项搜索不返回包含
- javascript - 如何使用http模块将嵌套对象转换为节点中的查询字符串
- javascript - 反应状态给出未定义的新反应
- node.js - 使用 TypeScript 3 的 Node.js Express API 更新记录
- html - 单击 django 中的 href 链接时出现意外/不需要的 url 路径