2016-05-31 9 views
1

Ich habe einen Anruf, der Versprechen verspricht. In diesem Moment habe ich dies:Wie übergeben Sie Argumente für Bluebird Callback in then()?

Something(...) 
    .then(()=>{console.log("Done.");}); 

Dies wäre praktisch:

Something(...) 
    .then(console.log, "Done."); 

Zum Beispiel setTimeout funktioniert wie folgt aus:

setTimeout(console.log, 1000, "Done."); 

Does Drossel haben keine Methode für diese ? Mein Ziel ist es, diese praktische Option zu haben, um die bereits lächerliche Menge an Code zu reduzieren, die Promises generiert.

+0

leider ist es Teil der Versprechen/A + Standard, wie Sie können auf [MDN] (https aufgelistet sehen://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) und auf [dieser Website] (https://promisesaplus.com/) setzt bluebird nur die Regeln durch, auch Sie muss ein Rückruf von einem Versprechen zurückgeben/ablehnen, weshalb es eine Funktion sein muss, ob es anon leer oder mit Daten gefüllt ist. --edit speziell mit diesem Bulletin [hier] (https://promisesaplus.com/#point-35) – Andrei

+1

"leider ist es Teil des Versprechens/A + Standard" Ich würde sagen, zum Glück **. :) Sonst hätte jede Implementierung etwas andersartige plötzliche polymophische "um lächerliche Menge an Code zu reduzieren blabla bla" –

Antwort

1

In diesem Moment habe ich dies:

Something(…).then(()=>{console.log("Done.");}); 

Dies ist der richtige Ansatz ist. Pfeilfunktionen verkürzen das schon sehr. Beachten Sie, dass Sie die Teile "{" ... ";}" fallen lassen können.

Dies wäre praktisch:

Something(…).then(console.log, "Done."); 

Nein, es würde nicht. Der zweite Parameter von then ist der onRejected Rückruf, keine Zeichenfolge. Das kannst du nicht tun.

Mein Ziel ist es, die bereits lächerliche Menge an Code zu reduzieren, die Promises generiert.

Dann verwenden Sie async/await Syntax und einen Transpiler. Es ist so einfach wie

await Something(…); 
console.log("Done"); 

Does Drossel jede Methode dafür?

Wenn Sie keine Transpiler verwenden möchten, sind aber in einer ES6 Umgebung (wie eine kürzlich Node.js), können Sie Generator-Funktionen verwenden async/await mit Promise.coroutine zu imitieren.

1

Diese Funktion ist ziemlich exklusiv für setTimeout. IE9 und darunter erfordert ein Polyfill für das sowieso https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

Das folgende wäre eine Problemumgehung für Ihren Beispielfall, der console.log verwendet. Seien Sie vorsichtig bei der Verwendung einer Funktion, die auf this verweist. Sie können bind verwenden, um den Wert this festzulegen oder undefined zu belassen. Außerdem wird der aufgelöste Wert des Versprechens nach "Fertig" protokolliert, da der Wert automatisch als letztes Argument an bind übergeben wird.

Something(...) 
    .then(console.log.bind(undefined, "Done.")); 
0

@Bergi gab eine ausgezeichnete Antwort auf Ihre Frage.Nur hinzufügen, wenn Sie () => console.log("Done.") oder einen anderen allgemeinen Rückruf viel verwenden, ist ihm eine separate Funktion machen:

function afterSomething() { 
    console.log("Done."); 
} 

Something(...) 
    .then(afterSomething); 
Verwandte Themen