【发布时间】:2021-01-15 16:49:25
【问题描述】:
我正在处理一个损坏的代码库,所以我试图尽可能少地接触。特别是,现在它使用的是 TypeScript 和 ES6,我需要启动一系列 Promise 并等待它们全部完成,然后再继续执行代码,无论它们是解决还是拒绝。所以这是 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))
})
})
但是我只看到了我自己的关于 Promise 的代码,所以我想获得一些关于我的实现的反馈。它会做其他开发人员期望它做的事情吗?特别是当涉及传递给解决/拒绝的参数时;现在我只传递一系列承诺,并希望开发人员在有兴趣跟进个别承诺时运行.then(promises => promises.forEach(...))。
我也不知道如何在这里使用 TypeScript 处理类型,因为我对 TypeScript 也没有那么丰富的经验。 (我觉得到处都写“any”并不酷。)
【问题讨论】:
-
订单未保存
-
它不会返回与
allSettled返回的相同的东西(一个通过status和value/reason道具实现对象数组的承诺)它只返回传递给它的内容. -
不,这不是一个有效的 polyfill。它不满足或拒绝正确的值。你甚至不需要使用
new Promise构造函数。它应该看起来像 more like this 或 that -
对我来说,这里的这部分
(results.every(value => value) ? resolve : reject)(promises)看起来你想要的是Promise.all而不是Promise.allSettled。如果一个人失败了,你还是要扔,那么等待所有人完成有什么意义?为什么不马上扔?为什么resolve/reject带有一系列承诺?allSettled会返回一个列表,其中包含哪些承诺成功,哪些承诺失败。这就是为什么它在返回结果之前等待所有完成。
标签: javascript promise