联手探秘:Promise.all 和 Promise.race 的合璧之舞,共同追寻异步的脚步
2023-09-23 23:26:47
踏入异步并发的世界,Promise.all 和 Promise.race 携手同行
在异步编程中,我们经常需要处理多个异步任务。为了简化异步编程,JavaScript 引入了 Promise 对象,提供了一种更优雅的方式来处理异步任务。Promise.all 和 Promise.race 是两个常用的 Promise 方法,它们可以帮助我们同时处理多个异步任务。
Promise.all 方法的作用是,当所有传入的 Promise 实例都被成功解析后,它才会返回一个已完成状态的 Promise 实例,并包含所有传入 Promise 实例解析结果的数组。这意味着,只有当所有异步任务都完成后,Promise.all 才会执行。
Promise.race 方法的作用是,当传入的 Promise 实例中的任何一个被成功解析或拒绝后,它就会返回一个已完成状态的 Promise 实例,并包含第一个被解析或拒绝的 Promise 实例的结果。这意味着,只要有一个异步任务完成后,Promise.race 就会执行。
两者各有千秋,Promise.all适用于所有任务都必须完成的场景,而Promise.race适用于只要有一个任务完成后即可的场景。
我们来看看如何使用Promise.all和Promise.race:
Promise.all([
fetch('data.json'),
fetch('image.png')
]).then((results) => {
// 所有任务完成后执行此代码
const data = results[0].json();
const image = results[1].blob();
}).catch((error) => {
// 只要有一个任务出错就执行此代码
console.error(error);
});
在这个例子中,我们同时发送了两个异步请求,分别是获取JSON数据和获取图像。当这两个请求都完成后,Promise.all会返回一个包含这两个结果的数组。
Promise.race([
fetch('data.json'),
fetch('image.png')
]).then((result) => {
// 第一个任务完成后执行此代码
const data = result.json();
const image = result.blob();
}).catch((error) => {
// 只要有一个任务出错就执行此代码
console.error(error);
});
在这个例子中,我们同时发送了两个异步请求,分别是获取JSON数据和获取图像。只要这两个请求中的任何一个完成后,Promise.race就会返回第一个完成的结果。
了解了Promise.all和Promise.race的基本用法,我们就可以着手创建自定义函数,结合这两个方法的优点,实现异步并发的同时顺序执行任务。
function myAsyncFunc(tasks) {
const promises = tasks.map((task) => task());
return Promise.all(promises).then((results) => {
return results.reduce((acc, result, index) => {
acc[tasks[index].name] = result;
return acc;
}, {});
});
}
这个函数接受一个任务数组作为参数,每个任务都应该是一个返回 Promise 的函数。函数内部将任务映射为 Promise 实例数组,然后使用 Promise.all 方法同时执行所有任务。当所有任务完成后,函数将使用 reduce 方法将任务结果按顺序组合成一个对象,并返回这个对象。
使用这个函数,我们可以实现异步并发的同时顺序执行任务:
myAsyncFunc([
() => fetch('data.json'),
() => fetch('image.png')
]).then((results) => {
// 所有任务完成后执行此代码
console.log(results);
});
在这个例子中,我们同时发送了两个异步请求,分别是获取JSON数据和获取图像。当这两个请求都完成后,myAsyncFunc会返回一个包含这两个结果的对象。
结语
Promise.all 和 Promise.race 是两个常用的 Promise 方法,它们可以帮助我们同时处理多个异步任务。本文介绍了如何使用这两个方法,以及如何创建自定义函数,结合这两个方法的优点,实现异步并发的同时顺序执行任务。希望本文能帮助您更好地理解和使用 Promise 对象,并为您的异步编程之旅提供帮助。