Javascript 诺言的问题解决了。意外回报
这是我的密码:Javascript 诺言的问题解决了。意外回报,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,这是我的密码: const Promise = require("bluebird"); const getRandomDelay = maxDelay => { return Math.floor(Math.random() * maxDelay) * 1000; }; const getAsyncNumbers = () => { const successDelay = getRandomDelay(1); const errorDelay = getRando
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!`);
});
我原以为控制台会返回“已满足”或“已拒绝”之类的结果,但我收到了:
未定义
未定义
未定义
我检查了结果,收到了:
承诺检查{
_位字段:33554432,
_settledValueField:[1,3,5,6,4,2]}
承诺检查{
_位字段:33554432,
_settledValueField:[1,3,5,6,4,2]}
承诺检查{
_位字段:33554432,
_settledValueField:[1,3,5,6,4,2]}
也许这里有人能帮我?高级版谢谢:)我遇到了同样的问题。我追踪到了最新版本的Bluebird(在我写这篇文章的时候),它包含在Webpack中,负责处理传输。首先,我编写了一个包装器来完成将值转换为预期值:
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)
这将允许解决所有承诺,而不会有一个或多个拒绝失败,只返回未被拒绝的响应。当然,你可以随心所欲地处理拒绝
希望这有帮助 我遇到了同样的问题。我追踪到了最新版本的Bluebird(在我写这篇文章的时候),它包含在Webpack中,负责处理传输。首先,我编写了一个包装器来完成将值转换为预期值:
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)
这将允许解决所有承诺,而不会有一个或多个拒绝失败,只返回未被拒绝的响应。当然,你可以随心所欲地处理拒绝
希望这有帮助