2015-05-18 8 views
11

Ho una serie di promesse, ogni promessa è una richiesta per eliminare un sito web. La maggior parte di esse si risolve ma possono essere casi in cui uno o due rifiutano, ad es. il sito web è inattivo Quello che voglio è ignorare le promesse respinte e mantenere i valori solo delle promesse che sono state risolte.Mantenere i valori solo da Promises che risolvono e ignorano il respinto

Promise.all non è per quel caso poiché richiede tutte le promesse da risolvere.

Promise.some() non è quello che voglio poiché non so in anticipo quante promesse si risolveranno.

Promise.any() è lo stesso Promise.some() con conteggio 1.

Come può questo caso viene risolto? Sto usando il Bluebird implementation.

+0

se potrebbe aggiungere un timeout per arrivare, tutti dovrebbero eventualmente "risolversi". Quindi mi chiedo se volevi testare periodicamente e vedere quanti si sono risolti? – Dinesh

+0

@Dinesh bene, questa non è una soluzione affidabile, cosa succede se non lo fa, se la 'risorsa' è giù per ore? Ci dovrebbe essere una soluzione più affidabile. –

risposta

15

Sicuro, per tua fortuna Bluebird già fa questo:

Promise.settle(arrayOfPromises).then(function(results){ 
    for(var i = 0; i < results.length; i++){ 
     if(results[i].isFulfilled()){ 
      // results[i].value() to get the value 
     } 
    } 
}); 

È inoltre possibile utilizzare il più recente reflect chiamata:

Promise.all(arrayOfPromises.map(function(el){ 
    return el.reflect(); 
})).filter(function(p){ 
    return p.isFulfilled(); 
}).then(function(results){ 
    // only fulfilled promises here 
}); 
+0

thx, accontentarsi di fare il lavoro. –

+0

@Benjamin Gruenbaum - Il problema con questo (Promise.reflect()) è che non è possibile utilizzare le proprietà dell'oggetto promessa (es. Nomeoggetto.proprietà) nel blocco allora. –

0

questo è lo stesso come soluzione @Benjamin ma con serie più elegante manipolazione:

questo codice ignorerà il risultato della promessa rifiutata, quindi è possibile eseguire 10 promesse e ottenere i risultati come matrice di 3 elementi:

Promise.settle(arrayOfPromises).then(function(results){ 
    return results.filter(function (result) { 
       return result.isFulfilled(); 
      }).map(function (result) { 
       return result.value(); 
      }); 
}).then(function(results){ 
    console.log("here you go:", results); 
}); 

qui ignorerà la promessa respinto, ma metterà null come risultato, quindi se si esegue 10 promesse avrete i risultati come array di 10 elementi del valore respinto sarà nullo:

Promise.settle(arrayOfPromises).then(function(results){ 
    return results.map(function (result) { 
       return result.isFulfilled()? result.value() : null; 
      }); 
}).then(function(results){ 
    console.log("here you go:", results); 
}); 
Problemi correlati