都2024年了,最近在回顾浏览MDN的时候发现node环境还没有支持Promise的静态方法withResolvers();
所以为了方便平时在node环境下使用,我们可以手动实现一个Promise._withResolvers();
/**
* Promise工具函数_withResolvers, 返回一个对象:
* 其中包含一个Promise实例: promise,以及用来改变这个实例promise状态的 resolve 和 reject 函数
* 由于node环境不支持Promise.withResolvers(),所以我们选择手动实现
* @returns {promise, resolve, reject}
*/
Promise._withResolvers = function _withResolvers() {
let resolve;
let reject;
let promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
return {promise, resolve, reject};
}
在搓代码的时候,用这个方法创建一个新的 Promise 是非常顺手的。
简单实现一个Promise.race的功能,用上Promise.withResolvers 就非常简洁了
Promise.race() 静态方法接受一个 promise 可迭代对象作为输入,并返回一个 Promise。这个返回的 promise 会随着第一个 promise 的敲定而敲定。简单的代码实现如下:
/**
* Promise.race() 静态方法接受一个 promise 可迭代对象作为输入,并返回一个 Promise。这个返回的 promise 会随着第一个 promise 的敲定而敲定。
* @param {*} tasks
* @returns promise
*/
Promise._race = function _race(tasks) {
const {promise, resolve, reject} = Promise._withResolvers();
for (const task of tasks) {
Promise.resolve(task).then(resolve, reject);
}
return promise;
}