最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Promise.all已解决的问题。意外的收益

网站源码admin14浏览0评论

Promise.all已解决的问题。意外的收益

Promise.all已解决的问题。意外的收益

这是我的代码:

const Promise = require("bluebird");

const getRandomDelay = maxDelay => {
  return Math.floor(Math.random() * maxDelay) * 1000;
};

const getAsyncNumbers = () => {
  const successDelay = getRandomDelay(1);
  const errorDelay = getRandomDelay(3);  

  return new Promise((resolve, reject) => {
    setTimeout(() => resolve([1, 3, 5, 6, 4, 2]), successDelay);

    setTimeout(() => reject(new Error("No numbers found :(")), errorDelay);
  });
};

Promise.allSettled([getAsyncNumbers(), getAsyncNumbers(), getAsyncNumbers()])
  .then(results => {
    results.forEach((result) => console.log(result.status))
  })
  .catch(err => {
    console.log(`${err} Proces zakończony!`);
  });

我希望控制台返回类似已完成或被拒绝的内容,但是我收到了:未定义未定义未定义

...

我检查了结果并收到了:

PromiseInspection {_bitField:33554432,_settledValueField:[1,3,5,6,4,2]}PromiseInspection {_bitField:33554432,_settledValueField:[1,3,5,6,4,2]}PromiseInspection {_bitField:33554432,_settledValueField:[1,3,5,6,4,2]}

也许这里有人可以帮助我吗?谢谢高级:)

回答如下:

我也遇到了同样的问题。我将其追溯到Webpack随附的最新版本的Bluebird(截至撰写本文时),该版本正在处理代码转换。首先,我编写了一个包装器,以完成将值转换为期望的值:

const IS_FULFILLED = 0x2000000
const IS_REJECTED = 0x1000000
const STATUS_MAP = {
  [IS_FULFILLED]: { status: 'fulfilled' },
  [IS_REJECTED]: { status: 'rejected' },
}

const transformAllSettled = (results) =>
 results.map(({ _bitField, _settledValueField, ...rest }) =>
    _bitField ? { ...STATUS_MAP[_bitField], value: _settledValueField } : rest,
  )

...

return Promise.allSettled(myPromises).then(transformAllSettled)

如果将来解决了问题,则可以通过响应进行传递。但是,我最终选择了不依赖于ECMAScript草案版本中仍不支持的功能的逻辑。

const gracefulFail = (promise) => promise.catch((error) => ({ error }))
const withoutRejected = (responses) => responses.filter(item => !item.error)

return Promise.all(myPromises.map(gracefulFail)).then(withoutRejected)

这将允许所有的诺言得以解决,而不会有一个或多个拒绝使整个诺言失败,仅返回那些未被拒绝的回答。当然,您可以按照自己喜欢的任何方式处理拒绝。

希望这会有所帮助!

发布评论

评论列表(0)

  1. 暂无评论