2014-10-29 3 views
6

Gibt es eine Möglichkeit, Rückruf für beide Ergebnisse von Promise-Objekt auszuführen?JavaScript native Promise führt Rückruf für beide Ergebnisse aus

Zum Beispiel möchte ich einige Aufräumlogik nach der Ausführung von xhr Anfrage machen. Also brauche ich so etwas wie dies zu tun:

var cleanUp = function() { something.here(); } 
myLib.makeXhr().then(cleanUp,cleanUp); 

In jquery zum Beispiel Defered i Methode immer verwenden können():

myLib.makeXhr().always(function() { something.here(); }); 

verspricht Unterstützung so etwas wie das?

+0

ich jetzt sehen, nur gibt es dann und Fangmethoden https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise Also wahrscheinlich keine Möglichkeit (oder Prototyp zu erweitern, um dies zu machen) –

+0

jQuery.Deferred(). Dann, wie mit mehreren Parametern zu lösen http://StackOverflow.com/Questions/24703887/Jquery-defered-then-how-to-resolve -mit-mehreren-Parametern1 – zavg

+1

Als Benjamin antwortete - nein. Deshalb gehe ich normalerweise mit https://github.com/petkaantonov/bluebird im Browser und es ist beitreten, alle und alle anderen Methoden. Natürlich ist es nicht nativ, aber es ist eine Lösung für viele vielversprechende Probleme plus Promistification. – Jarema

Antwort

7

Nein, es gibt keiner. Es war discussed, aber die Spezifikation ist minimal. Es enthält nicht eine Reihe anderer Funktionen. Es ist so konzipiert, dass es gut mit Bibliotheksversprechen interagiert und einfache Funktionalität bietet.

Here is a correct polyfill of that proposal originally made by StefPanner.

Darüber hinaus stimme ich nicht mit der aktuellen jetzt gelöschten Antworten fügen sie selbst, weil sie alle tun es falsch (als eine aufzählbare Eigenschaft - kein Spaß). Auch wenn wir ignorieren, was es mit den Rückgabewerten und dem Fehlerstatus des zurückgegebenen Versprechens macht. Der beabsichtigte Weg, native Versprechungen zu erweitern, ist , die sie unterteilen, leider unterstützen keine Browser dies noch, also müssen wir warten.

Statt mit nativen Prototypen von Unordnung, sollten wir ein anderes Muster verwenden:

openDb().then(foo).then(bar).finally(close).then(more); 

ist anfällig für uns zu vergessen der Nähe zu nennen, auch wenn wir es 100-mal in unserer App öffnen, vergessen sie sogar schließen Einmal kann es noch verheerend sein. Auf der anderen Seite - wir haben die Entsorger Muster verwenden können, die einige Versprechen Bibliotheken in ihnen selbst gebaut bieten:

openDb(function(db){ 
    return foo(db).then(bar);// chain here 
}).then(more); 

Grundsätzlich - dieses Muster bedeutet stattdessen openDB Rückkehr ein Versprechen mit - wir haben es, eine Funktion und Rückkehr ein Versprechen, wenn die Funktion ausgeführt wird, wenn sie eine Zusage zurückgibt, warten wir darauf, dass dieses Versprechen aufgelöst wird. Es sieht so etwas wie:

function openDb(withDb){ 
    return justOpenWithoutCleanUp(). 
      then(withDb). 
      then(clean, function(e){ clean(); throw e; }); // note the rethrow 
} 
-4

Das Promise-Objekt unterstützt 'immer'. .

Für zB:

var oPromise = jQuery.ajax ({ url: YOUR_URL }) immer (function() { YOUR_CLEAN_UP_METHOD();} )

+0

@SanktPipariya Es ist keine Frage, aber antworte – zavg

+0

@SanktPipariya Ich dachte, er versuchte zu antworten! – CinCout

+0

Die Downvoters sagen es dir nicht - aber sie werden dich wegen der Verwendung von jQuery ablehnen - es hat nichts mit der Frage zu tun, die native Versprechungen diskutiert. –