Javascript 我是否可以使用此Promise.allSetted的实施在ES2020之前解决?

Javascript 我是否可以使用此Promise.allSetted的实施在ES2020之前解决?,javascript,promise,Javascript,Promise,我正在处理一个坏的代码库,所以我尽量少接触。特别是,现在它使用的是TypeScript和ES6,我需要启动一系列承诺,等待它们全部完成,然后再继续执行代码,不管它们是解决还是拒绝。这就是Promise.allSettled的用例,它只在ES2020中可用 我尝试了以下实现: const myPromiseAllSettled = (promises) => new Promise((resolve, reject) => { const results = [] const

我正在处理一个坏的代码库,所以我尽量少接触。特别是,现在它使用的是TypeScript和ES6,我需要启动一系列承诺,等待它们全部完成,然后再继续执行代码,不管它们是解决还是拒绝。这就是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的参数时;现在,我只传递承诺数组,并希望开发人员运行
。然后(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我不明白这个问题,我能键入什么吗?我的意思是你能为你的代码提供类型脚本类型:)@PatrickDaSilva
Promise.resolve(p)
是指当传递数组中的一个值是不可使用的对象时,像字符串或数字。如果您尝试执行
“abc”。那么()
您将得到一个错误。但是,如果您将值包装在
Promise.resolve()
中,则所有操作都会顺利进行(您可以将带有普通值的数组传递给
allsolited
Promise.all()
)。@PatrickDaSilva
Promise.resolve(value)
将每个传递的值转换为
Promise
,如
字符串(value)
将每个传递的值转换为字符串。关于
then
的第二个参数,
catch(fn)
相当于
then(null,fn)