gpt4 book ai didi

javascript - 我可以在 ES2020 之前使用这个 Promise.allSettled 的实现吗?

转载 作者:行者123 更新时间:2023-12-04 15:08:13 35 4
gpt4 key购买 nike

我正在处理一个损坏的代码库,所以我试图尽可能少地接触。特别是,现在它正在使用 TypeScript 和 ES6,我需要启动一系列 promise 并等待它们全部完成,然后再继续执行代码,无论它们是 resolve 还是 reject。所以这是 Promise.allSettled 的用例,它仅在 ES2020 中可用。

我尝试了以下实现:

const myPromiseAllSettled = (promises) => new Promise((resolve, reject) => {
const results = []
const settle = (result) => {
results.push(result)
if (results.length === promises.length) {
(results.every(value => value) ? resolve : reject)(promises)
}
}
promises.forEach(promise => {
promise
.then(() => settle(true))
.catch(() => settle(false))
})
})

但是我只看过我自己的代码,所以我想得到一些关于我的实现的反馈。它会做其他开发人员期望它做的事情吗?特别是当涉及传递给 resolve/reject 的参数时;现在我只传递 promise 数组,并期望开发人员运行 .then(promises => promises.forEach(...)) 如果他们有兴趣跟进各个 promise 。

我也不知道我将如何在这里使用 TypeScript 处理类型,因为我对 TypeScript 也不是很熟悉。 (到处写“任何”对我来说似乎不太酷。)

最佳答案

它应该看起来更像这样:

const myPromiseAllSettled = (promises) => {
const fulfilled = value => ({ status: "fulfilled", value });
const rejected = reason => ({ status: "rejected", reason });

return Promise.all([...promises].map(p => Promise.resolve(p).then(fulfilled, rejected)));
}

[...promises] 处理 promises 可迭代但不是数组的情况。Promise.resolve(p) 因为传递的值可能不是 Promise(或 thenable)。

如果您只是想收到成功通知,您可以做一些更简单的事情:

const success = await Promise.all(promises).then(() => true, () => false);

编辑:不喜欢处理 promise 的方式可能是可迭代的但不是数组。添加一个 Array#map over iterables 的版本:

function* map(iterable, callback) {
for (const value of iterable) {
yield callback(value);
}
}

const myPromiseAllSettled = (promises) => {
const fulfilled = value => ({ status: "fulfilled", value });
const rejected = reason => ({ status: "rejected", reason });

return Promise.all(
map(
promises,
p => Promise.resolve(p).then(fulfilled, rejected)
)
);
}

关于javascript - 我可以在 ES2020 之前使用这个 Promise.allSettled 的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65680714/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com