Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 诺言的问题解决了。意外回报_Javascript_Node.js_Es6 Promise - Fatal编程技术网

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)
这将允许解决所有承诺,而不会有一个或多个拒绝失败,只返回未被拒绝的响应。当然,你可以随心所欲地处理拒绝

希望这有帮助