收益"/>
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)
这将允许所有的诺言得以解决,而不会有一个或多个拒绝使整个诺言失败,仅返回那些未被拒绝的回答。当然,您可以按照自己喜欢的任何方式处理拒绝。
希望这会有所帮助!
更多推荐
Promise.all已解决的问题。意外的收益
发布评论