网站首页 > 教程文章 正文
异步操作似乎让很多开发人员感到困惑。当与循环数组结合使用时尤其如此,因为每个可用选项都有一些警告。
对于循环
async 在对数组元素执行异步操作时,结合for(或for...of)循环可能是最直接的选择。await 在循环内使用for 将导致代码停止并等待异步操作完成后再继续。这意味着所有的 Promise 都将按顺序运行。
const asyncUppercase = item =>
new Promise(resolve =>
setTimeout(
() => resolve(item.toUpperCase()),
Math.floor(Math.random() * 1000)
)
);
const uppercaseItems = async () => {
const items = ['a', 'b', 'c'];
for (item of items) {
const uppercaseItem = await asyncUppercase(item);
console.log(uppercaseItem);
}
console.log('Items processed');
};
uppercaseItems();
// LOGS: 'A', 'B', 'C', 'Items processed'
Promise
Promise.all() 为数组上的异步循环提供了另一种选择。与前一个Promise.all()的主要区别在于并行执行所有异步操作。这意味着Promise将无序执行,这在某些情况下可能是一个问题。大多数情况下,这是我首选的解决方案,因为希望 Promise 按顺序执行是非常罕见的。
const asyncUppercase = item =>
new Promise(resolve =>
setTimeout(
() => resolve(item.toUpperCase()),
Math.floor(Math.random() * 1000)
)
);
const uppercaseItems = () => {
const items = ['a', 'b', 'c'];
return Promise.all(
items.map(async item => {
const uppercaseItem = await asyncUppercase(item);
console.log(uppercaseItem);
})
).then(() => {
console.log('Items processed');
});
};
// LOGS: 'A', 'C', 'B', 'Items processed'
数组方法
不幸的是,数组方法(例如)Array.prototype.forEach()不适用于async/ await。唯一可行的解决方案是使用前面示例中所示的方法Promise.all()。使用async回调Array.prototype.forEach()将导致其余代码执行并且不等待异步操作。
const asyncUppercase = item =>
new Promise(resolve =>
setTimeout(
() => resolve(item.toUpperCase()),
Math.floor(Math.random() * 1000)
)
);
const uppercaseItems = async () => {
const items = ['a', 'b', 'c'];
await items.forEach(async item => {
const uppercaseItem = await asyncUppercase(item);
console.log(uppercaseItem);
});
console.log('Items processed');
};
uppercaseItems();
// LOGS: ''Items processed', 'B', 'A', 'C'
猜你喜欢
- 2025-05-30 ES6学习(17):彻底搞懂 async 和 await,轻松掌握异步编程!
- 2025-05-30 Promise.all() 并行处理多个异步任务
- 2025-05-30 Vue.js 中的异步组件是什么?
- 2025-05-30 Node.js全栈开发的深度实践:从异步编程到云原生架构
- 2025-05-30 js异步编程之async/await详解
- 2025-05-30 JavaScript 异步编程指南 - 聊聊 Node.js 中的事件循环
- 2025-05-30 JavaScript异步编程Async/Await详解
- 2025-05-30 NODE.JS中的异步理解
- 2025-05-30 深入解析 JavaScript 中的 Promise 与 await:异步编程的利器
- 2025-05-30 一个JavaScript技巧让异步代码同步化,太强大了
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)