2016-08-24 2 views
1

Unten ist mein ZustandAufruf Q Versprechen auf der Grundlage der bedingten Logik

if abc is true 
    call async func1, func2 
else 
    call async func1 

function test(): Q.Promise<boolean> { 
    if(abc) 
     Q.all([func1,func2]) 
    else 
     Q.all([func1]) 
    //if failed throw reject reason all the way in the chain 
} 
  1. Wie gezeigt, kann es mit if und else Klausel durchgeführt wird, gibt es eine bessere Art und Weise Versprechen bedingt zu nennen?
  2. Wie man zurückwirft error from any one of the promises?

Antwort

1

würde ich Versprechen in Reihe setzen und neue unter der Bedingung abhängig hängen:

function test(): Q.Promise<Boolean[]> { 
    const promises = [func1()] 
    if (abc) promises.push(func2()) 
    return Q.all(promises) 
} 

I-Typ Unterschrift ein wenig korrigiert, weil Q.all mit Array lösen von Werten (Boolean in Ihrem Fall) aus jeder Basiswert verspricht. Sie müssen auch func1 und func2 anrufen. Und schließlich, vergessen Sie nicht, von test Funktion zurückzukehren.

+0

Was passiert, wenn eines der 'Versprechen' abgelehnt wird und wie würde ich diesen' Fehler' den ganzen Weg nach oben werfen? Ich versuche zu lernen "Q.verspricht", also entschuldige, wenn es eine dumme Frage ist :) – Reddy

+0

Du musst nicht explizit werfen. Wenn eine der Funktionen das abgelehnte Versprechen zurückwirft oder zurückgibt, dann wird 'Q.all' auch für Sie ablehnen und der Fehler wird automatisch zu Q.all error handler:' test(). Then (function() {console.log (' alles gut ')}). catch (funktion (fehler) {console.log (' etwas ging schief ')}) '. – dfsq

0

Sie sind eigentlich ziemlich nahe schon:

function test() { 
    if(abc) 
     return Q.all([func1(),func2()]) 
    else 
     return func1(); 
} 
test().then(() => { 
    // do whatever 
}).catch(err => console.log(err)); 

sicher, dass Sie die Versprechen immer wieder zurückkehren, da sie sonst nicht bekommen gekettet.

Verwandte Themen