Javascript 一旦所有内部并发承诺都已解决或拒绝,则解决承诺

Javascript 一旦所有内部并发承诺都已解决或拒绝,则解决承诺,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我正在寻找类似于承诺的东西。所有都将继续同时解决承诺,即使一个或多个承诺拒绝或抛出错误。每个请求并不依赖于另一个请求 接近我想要的-请查看评论 function fetchRequest (request) { return new Promise(function (resolve, reject) { fetch(request) .then(function(response) { return response.text(); }).

我正在寻找类似于承诺的东西。所有都将继续同时解决承诺,即使一个或多个承诺拒绝或抛出错误。每个请求并不依赖于另一个请求

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

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
});

请只回答本机es6 promise API,谢谢。

您本质上是在寻求一种方法来消除任何错误。因此,这样的函数将是您的最佳选择:

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) {
   // ...
 });

您本质上是在寻求一种方法来消化任何错误。因此,这样的函数将是您的最佳选择:

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) {
   // ...
 });
我已经成功地使用了
Promise.all
以及只解析
fetchRequest
promises

基本上就是这样。对于这种情况,ES6没有(Q)或(Bluebird 2.x)这样的帮助函数,因此我们需要像您一样使用类似的帮助函数。蓝鸟甚至有一个专门的实用程序

但是,在拒绝的情况下,您不会使用
undefined
来解决这些问题,而是使用一些有用的值来识别错误

function promiseRequests(requests) {
  return Promise.all(requests.map(request => {
    return fetch(request).then(res => {
      return {value:res};
    }, err => {
      return {reason:err};
    });
  }));
}
我已经成功地使用了
Promise.all
以及只解析
fetchRequest
promises

基本上就是这样。对于这种情况,ES6没有(Q)或(Bluebird 2.x)这样的帮助函数,因此我们需要像您一样使用类似的帮助函数。蓝鸟甚至有一个专门的实用程序

但是,在拒绝的情况下,您不会使用
undefined
来解决这些问题,而是使用一些有用的值来识别错误

function promiseRequests(requests) {
  return Promise.all(requests.map(request => {
    return fetch(request).then(res => {
      return {value:res};
    }, err => {
      return {reason:err};
    });
  }));
}

首先,要避免错误!“它还删除了我使用抛出错误的能力。”-那么为什么不干脆
resolve(err)
?您打算如何使用它们?你想如何区分履行和拒绝?啊,我明白了。在阅读了你的链接Bergi之后,我想我对承诺的理解终于实现了。我认为多梅尼克的回答解决了我问题的症候,但伯吉的回答解决了根本原因。首先,避免错误!“它还删除了我使用抛出错误的能力。”-那么为什么不干脆
resolve(err)
?您打算如何使用它们?你想如何区分履行和拒绝?啊,我明白了。在阅读了你的链接Bergi之后,我想我对承诺的理解终于实现了。我认为Domenic的回答解决了我问题的症状,但Bergi的回答解决了根本原因。请参见
Promise.all()的结尾处。问题:此模式是否处理了@guest271314中描述的“过于敏感的错误处理程序”案例?@guest271314:无需“处理”它-(是的,我知道我在做什么:-)注意,没有
返回
中的
.map()
,在
获取
promiseRequests
似乎返回
未定义的
值,@guest271314:这是一个arrow函数,其中返回是隐式的:-),但为了清晰起见(以及与其他两个表达式的一致性,其中不可能有简明的正文),“这是一个arrow函数,其中返回是隐式的:-”),我在夜间尝试了arrow函数,但在
获取之前没有
返回
;在
promiseRequests
promiseRequests
值中,似乎返回了
未定义的
,请参见
Promise.all()的结尾处。问题:此模式是否处理了@guest271314中描述的“过于敏感的错误处理程序”案例?@guest271314:无需“处理”它-(是的,我知道我在做什么:-)注意,没有
返回
中的
.map()
,在
获取
promiseRequests
似乎返回
未定义的
值,@guest271314:这是一个arrow函数,其中返回是隐式的:-),但为了清晰起见(以及与其他两个表达式的一致性,其中不可能有简明的正文),“这是一个arrow函数,其中返回是隐式的:-”),我在夜间尝试了arrow函数,但在
获取之前没有
返回
;对于
promiseRequests
中的
Promise
值,似乎返回了
未定义的