Javascript 我是否可以使用此Promise.allSetted的实施在ES2020之前解决?
我正在处理一个坏的代码库,所以我尽量少接触。特别是,现在它使用的是TypeScript和ES6,我需要启动一系列承诺,等待它们全部完成,然后再继续执行代码,不管它们是解决还是拒绝。这就是Promise.allSettled的用例,它只在ES2020中可用 我尝试了以下实现:Javascript 我是否可以使用此Promise.allSetted的实施在ES2020之前解决?,javascript,promise,Javascript,Promise,我正在处理一个坏的代码库,所以我尽量少接触。特别是,现在它使用的是TypeScript和ES6,我需要启动一系列承诺,等待它们全部完成,然后再继续执行代码,不管它们是解决还是拒绝。这就是Promise.allSettled的用例,它只在ES2020中可用 我尝试了以下实现: const myPromiseAllSettled = (promises) => new Promise((resolve, reject) => { const results = [] const
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的参数时;现在,我只传递承诺数组,并希望开发人员运行。然后(promises=>promises.forEach(…)
,如果他们有兴趣跟进单个承诺的话
我也不知道在这里如何处理TypeScript类型,因为我对TypeScript也不是很有经验。(在任何地方写“any”对我来说都不酷。)它应该更像这样:
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);
编辑:不喜欢处理的方式
承诺
可能是一个可编辑但没有数组。添加一个将Array#map
s映射到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)
)
);
}
订单未被保留。它不会返回与
allsolited
返回的内容相同的内容(一个承诺,它满足具有status
和value/reason
道具的对象数组),它只返回传递给它的内容。不,这不是有效的多边形填充。它不能满足或拒绝正确的值。您甚至不需要使用newpromise
构造函数。在我看来,这部分应该是(results.every(value=>value)?resolve:reject)(promissions)
看起来像是你想要Promise.all
而不是Promise.allsolved
。如果你还是要扔,如果有一个失败了,等待所有的东西都完成又有什么意义呢?为什么不马上扔?为什么要用一系列承诺来解决/拒绝
allselled
返回承诺成功和承诺失败的列表。这就是它在返回结果之前等待所有操作完成的原因。你能键入它吗?@marzelin我不明白这个问题,我能键入什么吗?我的意思是你能为你的代码提供类型脚本类型:)@PatrickDaSilvaPromise.resolve(p)
是指当传递数组中的一个值是不可使用的对象时,像字符串或数字。如果您尝试执行“abc”。那么()
您将得到一个错误。但是,如果您将值包装在Promise.resolve()
中,则所有操作都会顺利进行(您可以将带有普通值的数组传递给allsolited
或Promise.all()
)。@PatrickDaSilvaPromise.resolve(value)
将每个传递的值转换为Promise
,如字符串(value)
将每个传递的值转换为字符串。关于then
的第二个参数,catch(fn)
相当于then(null,fn)