2016-11-09 3 views
-3

Ich muss das Ergebnis von einem Versprechen zu testen. Wird ein Versprechen rechtzeitig gelöst, um Teil eines Konditionals zu sein?Verspricht ein Versprechen rechtzeitig zu einem bedingten Teil

if (myPromise() > 15 && myOtherPromise()) { 
    // do stuff when myPromise resolves to over 15 and myOtherPromise is true 
} else { 
    // do stuff when myPromise resolves to 15 or less or myOtherPromise is false 
} 

Oder muss ich es nur bis saugen müssen und zu tun:

let myP = myPromise(); 
let myOtherP = myOtherPromise(); 

promise.all([myP, myOtherP]).then(function(res) { 
    if (res[0] > 15 && res[1]) { 
     // do stuff when myPromise resolves to over 15 and myOtherPromise is true 
    } else { 
     // do stuff when myPromise resolves to 15 or less or myOtherPromise is false 
    } 
}); 

von Kommentar unten Dritten zugänglich gemacht für alle „Downvoting“ die Frage und das Denken ist eine Wiederholung.

Nun, ja und nein. Nein, weil ich mit Jasmine arbeite, wo die Expect-Calls automatisch ein Versprechen lösen, wenn man es passiert. expect(myPromise()).toBeGreaterThan(15). Von außen könnte es also denkbar gewesen sein, dass eine bedingte Bedingung eine Verheißung auflösen könnte, bevor irgendwelche Vergleiche durchgeführt werden.

+0

Sie können nicht wissen (Das ist der e-Punkt von asynchron). Just "suck it up" oder rufen Sie eine Rückruffunktion – nicovank

+0

Nun, ja und nein. Nein, weil ich mit Jasmine arbeite, wo die Expect-Calls automatisch ein Versprechen lösen, wenn man es passiert. 'expect (myPromise()). toBeGreaterThan (15)'. Von außen könnte es also denkbar gewesen sein, dass eine bedingte Bedingung eine Verheißung lösen könnte, bevor sie Vergleiche anstellt. – Machtyn

+0

@Machtyn 'if' und die anderen Kontrollflusskonstrukte haben keine Unterstützung für Versprechungen. Es wäre interessant, asynchrone Versionen von ihnen zu haben, aber ich kenne keinen Vorschlag dafür. – ssube

Antwort

0

Unter der Annahme, myPromise und myOtherPromise sind Funktionen, die Versprechen zurück, die Ihr Code, um anzuzeigen scheint, dann NO können Sie nicht tun:

if (myPromise() > 15 && myOtherPromise()) { 

Promises sind Objekte. Also, wenn myPromise() kehrt ein Versprechen, dann:

if (myPromise())` 

ist immer truthy und dass if Aussage hat absolut nichts mit dem eventuellen aufgelösten Wert der Verheißung zu tun. Also, diese erste if Anweisung überprüft nicht den aufgelösten Wert der beiden Versprechen.


Wenn Sie den aufgelösten Wert eines promoise sehen wollen, haben Sie so etwas wie .then() oder .all() zu verwenden, den aufgelösten Wert zu erhalten. Es gibt keine andere Möglichkeit, auf den aufgelösten Wert zuzugreifen.

Wenn Sie untersuchen möchten sowohl die aufgelösten Werte von myPromise() und myOtherPromise(), dann sind Sie für beide warten müssen zu lösen und Sie sollten Promise.all() wie in Ihrem zweiten Codebeispiel verwenden:

Promise.all([myPromise(), myOtherPromise()]).then(function(results) { 
    if (results[0] > 15 && results[1]) { 
     // got the result we wanted 
    } 
}).catch(function(err) { 
    // error here 
}); 
+0

Warum der Downvote? – jfriend00

+0

Ja, ich hätte das bei meiner myOtherPromise() erkannt und stattdessen myOtherPromise() == true in meinem "bad" Beispiel getan. – Machtyn

+0

@Machtyn - Huhhh? 'myOtherPromise() == true' tut dir auch nicht gut. Ein Versprechen ist ein Objekt. Sie können ihren Wert nur mit 'p.then()' oder 'Promise.all ([p1, p2])' erhalten. Mit 'if (p)' kannst du NIEMALS einen Wert erhalten. – jfriend00