如此好用:Promise.withResolvers()

本文介绍了如何在Node环境中,由于缺少Promise.withResolvers支持,手动实现了一个Promise._withResolvers函数,提供resolve和reject方法。此外,作者还展示了如何利用这个工具简化Promise.race的实现。
摘要由CSDN通过智能技术生成

都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;
}

前端面试中,Promise.all() 是一个常见的问题。它是一个用于处理多个 Promise 对象的方法,返回一个新的 Promise 对象。根据引用所述,Promise.all() 方法接收一个 promise 的 iterable 类型的输入(例如数组),并且只返回一个 Promise 实例。当所有输入的 promise 都成功执行时,Promise.all() 返回的 Promise 对象的 resolve 回调会传递一个包含所有 promise 结果的数组。如果输入的 promise 中有任何一个失败或者输入不合法的 promisePromise.all() 返回的 Promise 对象的 reject 回调会立即抛出错误,并且 reject 的是第一个抛出的错误信息[^2]。 以下是一个示例,演示了如何使用 Promise.all() 方法: ```javascript const promise1 = Promise.resolve(3); const promise2 = 42; const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([promise1, promise2, promise3]) .then(values => { console.log(values); // 输出:[3, 42, 'foo'] }) .catch(error => { console.error(error); // 如果有任何一个 promise 失败,会立即抛出错误 }); ``` 在上面的示例中,我们创建了三个 Promise 对象:promise1、promise2 和 promise3。promise1 是一个已经解决的 Promisepromise2 是一个普通的值,promise3 是一个在 100 毫秒后解决的 Promise。我们将这三个 Promise 对象作为参数传递给 Promise.all() 方法。当所有的 Promise 都成功执行时,Promise.all() 返回的 Promise 对象的 resolve 回调会传递一个包含所有 promise 结果的数组。在这个示例中,我们通过 then() 方法获取到了这个数组,并将其打印出来。如果有任何一个 Promise 失败,Promise.all() 返回的 Promise 对象的 reject 回调会立即抛出错误,并且 reject 的是第一个抛出的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值