Résolvez une promesse une fois que toutes les promesses concurrentes internes ont résolu ou rejeté

Je cherche quelque chose de similaire à Promise.all qui continuera à résoudre les promesses simultanément, même si une ou plusieurs des promesses rejettent ou jettent une erreur. Chaque demande ne repose pas sur une autre demande.

Près de ce que je veux – voir les commentaires

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

J'ai réussi à utiliser Promise.all ensemble avec seulement la résolution de fetchRequest, ce qui entraîne le résultat attendu (un ensemble de résultats et undefined ), mais je pense que c'est la mauvaise façon de faire les choses. Cela supprime aussi ma capacité à utiliser des erreurs répétées.

Fonctionne mais se sent comme une utilisation incorrecte de la résolution

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

S'il vous plaît, seulement les promesses natives d'es6 promettent des réponses API.

J'ai réussi à utiliser Promise.all ensemble avec seulement des résolutions de fetchRequest

C'est essentiellement le chemin à parcourir. ES6 n'a pas de fonction d'aide comme allSettled (Q) ou settle (Bluebird 2.x) pour ce cas, nous devrons donc utiliser Promise.all comme vous l'avez fait. Bluebird dispose même d'un .reflect() dédié .reflect() pour cela.

Vous ne les résolvirez cependant pas avec un undefined dans le cas d'un rejet, mais plutôt avec une valeur utile qui permet d'identifier les erreurs.

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

Vous demandez essentiellement un moyen d'avaler des erreurs. En tant que tel, une fonction comme celle-ci sera votre meilleur pari:

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

Vous l'utiliseriez comme suit:

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

ou même

  const promises = ['url1.com', 'url2.com'].map(fetch).map(swallow); Promise.all(promises).then(function (data) { // ... });