2015-05-18 11 views
11

Mam szereg obietnic, każda obietnica jest prośbą o złomowanie strony internetowej. Większość z nich rozwiązuje się, ale mogą to być przypadki, w których jeden lub dwóch odrzuca np. witryna jest wyłączona. Chcę tylko zignorować odrzucone obietnice i zachować tylko wartości obietnic, które zostały rozwiązane.Zachowaj wartości tylko z obietnic, które rozwiązują i ignorują odrzucone

Promise.all nie jest w tym przypadku, ponieważ wymaga wszystkich obietnic do rozwiązania.

Promise.some() nie jest tym, czego chcę, ponieważ nie wiem wcześniej, ile obietnic rozwiąże.

Promise.any() jest taka sama jak Promise.some() z liczbą 1.

Jak to przypadek rozwiązywane? Używam Bluebird implementation.

+0

jeśli ciebie można dodać timeout, aby uzyskać, wszystkie powinny ostatecznie "rozwiązać". Zastanawiam się więc, czy chciałeś okresowo testować i zobaczyć, ile zostało rozwiązanych? – Dinesh

+0

@ Dinesh cóż, to nie jest niezawodne rozwiązanie, co jeśli to nie zrobi, jeśli 'zasób' nie działa przez wiele godzin? Powinno istnieć bardziej niezawodne rozwiązanie. –

Odpowiedz

15

Jasne, na szczęście już Bluebird robi to:

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

Można również skorzystać z nowszego reflect połączenia:

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

thx, settle wykonał zadanie. –

+0

@Benjamin Gruenbaum - Problem z tym (Promise.reflect()) polega na tym, że nie możesz użyć właściwości obiektu obietnicy (np. Objectname.itsproperty) w bloku wtedy. –

0

ten jest taki sam jak roztwór @Benjamin ale z bardziej eleganckim tablicy manipulacja:

ten kod zignoruje odrzucony wynik obietnicy, więc możesz uruchomić 10 obietnic i uzyskać wyniki w postaci tablicy 3 elementów:

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

tutaj zignoruje odrzucony obietnicy ale umieści null jako rezultat więc jeśli uruchomić 10 obietnic będziesz miał wyniki jak tablicy 10 elementów odrzuconych wartość będzie zerowa:

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); 
}); 
Powiązane problemy