js怎么实现异步并行
异步并行实现方法
在JavaScript中,实现异步并行操作可以通过多种方式完成。以下是几种常见的方法:
Promise.all
Promise.all 方法接收一个Promise数组,当所有Promise都成功时返回一个新的Promise,该Promise的结果是一个包含所有Promise结果的数组。如果其中任何一个Promise失败,整个Promise.all会立即拒绝。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values); // [3, 42, "foo"]
});
Promise.allSettled
Promise.allSettled 方法会等待所有Promise完成(无论成功或失败),返回一个包含每个Promise结果的对象数组。
const promise1 = Promise.resolve(3);
const promise2 = new Promise((_, reject) => setTimeout(reject, 100, 'error'));
Promise.allSettled([promise1, promise2]).then((results) => {
console.log(results);
// [
// { status: 'fulfilled', value: 3 },
// { status: 'rejected', reason: 'error' }
// ]
});
async/await 结合 Promise.all
在async函数中,可以使用await Promise.all来并行执行多个异步操作。
async function parallelAsyncTasks() {
const [result1, result2] = await Promise.all([
fetch('https://api.example.com/data1'),
fetch('https://api.example.com/data2')
]);
const data1 = await result1.json();
const data2 = await result2.json();
console.log(data1, data2);
}
并行执行非Promise任务
对于非Promise任务,可以使用Promise.all包装成Promise数组来并行执行。
const tasks = [
() => new Promise(resolve => setTimeout(() => resolve('Task 1'), 1000)),
() => new Promise(resolve => setTimeout(() => resolve('Task 2'), 500)),
() => 'Task 3' // 非Promise任务
];
Promise.all(tasks.map(task => Promise.resolve(task()))).then(results => {
console.log(results); // ["Task 1", "Task 2", "Task 3"]
});
第三方库(如async.js)
使用第三方库如async.js可以更方便地实现并行控制。
const async = require('async');
async.parallel([
function(callback) { setTimeout(() => callback(null, 'one'), 200); },
function(callback) { setTimeout(() => callback(null, 'two'), 100); }
], (err, results) => {
console.log(results); // ['one', 'two']
});
注意事项
- 并行执行的Promise数量过多可能导致资源竞争,需根据实际情况控制并发数。
- 使用
Promise.all时,任一Promise失败会导致整个操作失败,需考虑错误处理。 Promise.allSettled适合需要知道所有Promise最终状态的场景。







