1

我正在寻找类似的东西Promise.all,即使在一个或多个承诺拒绝或抛出错误的情况下,也会继续同时解决承诺。每个请求不依赖于另一个请求。

接近我想要的 - 请查看评论

function fetchRequest (request) {
  return new Promise(function (resolve, reject) {
    fetch(request)
    .then(function(response) {
      return response.text();      

    }).then(function (responseXML) {
      //Do something here. Maybe add data to dom
      resolve(responseXML);

    }).catch(function (err) {
      reject(new Error(err));
    }
}

function promiseRequests (requests) {
  var result = Promise.resolve();

  for (var i = 0; i < requests.length; i++) {
    result = fetchRequest(requests[i])
  }

  //This is wrong as it will resolve when the last promise in the requests array resolves
  // - not when all requests resolve
  resolve(result);
}

promiseRequests(['url1.com', 'url2.com']).then(function (data) {
  console.log('All requests finished');
  //optionally have data be an array of resolved and rejected promises
});

我已经成功地Promise.all一起使用,只解决了 fetchRequest 承诺,这导致了预期的结果(一系列结果和undefined's),但我觉得这是错误的做事方式。它还消除了我使用抛出错误的能力。

有效,但感觉像是对 resolve 的错误使用

function fetchRequest (request) {
  return new Promise(function (resolve, reject) {
    fetch(request)
    .then(function(response) {
      return response.text();      

    }).then(function (responseXML) {
      resolve(responseXML);

    }).catch(function (err) {
      resolve();
    }
}

Promise.all([fetchRequest('url1.com'), fetchRequest('url2.com')]).then(function (data) {
  console.log('All requests finished', data); //data could be ['resultXML', undefined]
});

请仅本机 es6 Promise API 回答谢谢。

4

2 回答 2

6

我已经成功地Promise.all一起使用,只解决了fetchRequest承诺

这基本上就是要走的路。对于这种情况, ES6 没有像allSettled(Q) 或settle(Bluebird 2.x) 这样的辅助函数,所以我们需要Promise.all像你一样使用类似的函数。Bluebird 甚至为此提供了专门的.reflect()实用程序。

但是,您不会undefined在拒绝的情况下解决它们,而是使用一些允许识别错误的有用值。

function promiseRequests(requests) {
  return Promise.all(requests.map(request => {
    return fetch(request).then(res => {
      return {value:res};
    }, err => {
      return {reason:err};
    });
  }));
}
于 2015-06-19T05:17:39.030 回答
4

您本质上是在寻求一种吞下任何错误的方法。因此,像这样的函数将是您最好的选择:

function swallow(p) {
  // transforms rejected promises into promises fulfilled with undefined
  return p.catch(function () { });
}

您可以按如下方式使用它:

Promise.all([swallow(fetch('url1.com')), swallow(fetch('url2.com'))]).then(function (data) {
  console.log('All requests finished', data); //data could be ['resultXML', undefined]
});

甚至

 const promises = ['url1.com', 'url2.com'].map(fetch).map(swallow);
 Promise.all(promises).then(function (data) {
   // ...
 });
于 2015-06-19T05:17:15.070 回答