2017-01-18 3 views
1

Im folgenden Beispiel möchte ich somePromise bedingt ausführen, dann unabhängig von der Bedingung anotherPromise ausführen.Wie kombiniere ich Promises mit if?

if (somecondition) { 
    somePromise().then((args) => { ... }); 
} 

// Not waiting for somePromise() here, but it should. 
return anotherPromise().then((args) => { 
    muchmorecodehere; 
} 

Der einzige Weg, ich jetzt denken kann, ist den letzten Teil in eine Funktion zu drehen und es in beiden Zweigen ausführen, aber das scheint sehr umständlich. Sicher mache ich etwas falsch?

let helperFunction =() => { 
    return anotherPromise().then((args) => { 
     muchmorecodehere; 
    } 
} 

if (somecondition) { 
    return somePromise().then((args) => { ... }).then(helperFunction); 
} 

return helperFunction; 
+1

Nur um zu klären - wenn 'somePromise' ausgeführt wird, willst du' anotherPromise' warten, bis das fertig ist, bevor du beginnst? Oder willst du nur, dass sie beide laufen? –

+0

Warum nicht zuerst Kette und Ausschuss verwenden, um zu vermeiden, dass die zweite ausgeführt wird? – VadimB

+0

Ja, 'anotherPromise' sollte warten, bis' somePromise' zuerst fertig ist. Vielen Dank. – cib

Antwort

2

Sie können die Vorteile aus der Tatsache ziehen, dass .then() gibt ein neues Versprechen und Kette aus entweder das oder ein Dummy-Versprechen:

var nextPromise = somecondition 
    ? somePromise.then((args) => { ... }) 
    : Promise.resolve(); 

return nextPromise.then(() => anotherPromise) 
    .then((args) => { 
     // muchmorecodehere 
    }); 
+0

Wenn ich Ihre Lösung richtig verstehe, wird 'somePromise' unabhängig von der Bedingung ausgeführt. Ich möchte 'somePromise' nur ausführen, wenn die Bedingung wahr ist. Vielleicht anstelle von ': somePromise',': Promise.resolve() 'oder etwas in dieser Richtung? – cib

+1

@cib Sie können das 'somePromise' in Zeile 3 durch' Promise.resolve() 'ersetzen und ich habe meinen Beitrag dazu bearbeitet, aber es scheint, dass Sie etwas Verwirrung darüber haben, wie Versprechen funktionieren. Sie warten normalerweise nicht auf die Ausführung, bis Sie '.then()' auf ihnen aufrufen. Sie beginnen normalerweise mit der Ausführung, sobald Sie sie erstellt haben. 'then()' bietet nur eine Möglichkeit, das Ergebnis zu erhalten, wenn es verfügbar ist. – JLRishe

+0

Ein guter Punkt, ich hätte wahrscheinlich 'somePromise' als' createSomePromise() 'stattdessen schreiben sollen, mein Schlechter. – cib

1

Sie eine Standard-anlegen können, bereits gelöst, versprechen (lässt Anruf es conditionalPromise), für den bedingten Teil und verkettet immer dieses Versprechen mit anotherPromise.

Wenn someConditionfalse ist, dann ist conditionalPromise ein bereits gelöst Versprechen und es kann sicher anotherPromise verkettet werden.

Wenn someCondition ist true dann somePromise zu conditionalPromise zugeordnet ist, und wenn es aufgelöst wird, dann wird anotherPromise ausgeführt werden.

conditionalPromise = Promise.resolve(); // Create a default, already resolved, promise 
if (someCondition) { 
    // Assign somePromise to conditionalPromise, overwriting the default one 
    conditionalPromise = somePromise 
} 

// Now chain the 2 promises 
return conditionalPromise.then((args) => { 
    anotherPromise.then((args) => { 
     muchmorecodehere; 
    } 
}); 
0

Ein anderer Weg, um das Problem zu bekommen, ist nur die ersten if in einem then Block wickeln, indem sie ein Promise.resolve() Verkettungs.

return Promise.resolve().then(() => { 
    if (somecondition) { 
     return somePromise().then((args) => { ... }); 
    } 
}).then(() => { 
    return anotherPromise(); 
}).then((args) => { 
    //muchmorecodehere 
});