2014-10-08 5 views
5

Ich habe eine Funktion wie diese versprechen:Wie Funktionsaufruf mit zwei Rückrufen konvertieren

var f = function(options, successCallback, errorCallback) { 
    ... 
} 

und ich mag es Anruf an ein Versprechen konvertieren. Meine aktuelle Lösung ist dies:

var deferred = Q.defer(); 

f(options, 
    function (result) { 
     deferred.resolve(result); 
    }, function (err) { 
     deferred.reject(err); 
    } 
); 

return deferred.promise; 

Ich kann den Q.fcall verwenden, da es eine Rückruf Node.js-Stils erwartet function(err, result) { ... }

So ist es eine Möglichkeit, meinen Code mit den Q API zu verbessern ?

Antwort

4

Nein, all diese Hilfsfunktionen (basierend auf Deferred.makeNodeResolver) sind nur da, um mit den hässlichen Nodebacks fertig zu werden. Wenn die Callback-Methode bereits getrennte Erfolgs- und Fehlerrückrufe benötigt, muss nicht viel zusätzliche Arbeit geleistet werden.

Sie Ihre Musterausdrücke, indem diese unnötigen Verschlussfunktion vereinfachen könnte:

var deferred = Q.defer(); 
f(options, deferred.resolve, deferred.reject); 
return deferred.promise; 

Sie auch die Promise constructor verwenden könnte, die die bevorzugte Methode für Versprechen Schöpfung ist (Bonus: fängt Ausnahmen throw n von f):

return new Q.Promise(function(resolve, reject) { 
    f(options, resolve, reject); 
}); 

, die auch bei Teil Anwendung verkürzt werden könnte

auch
return new Q.Promise(f.bind(null, options)); 

Siehe die allgemeine Referenz: How do I convert an existing callback API to promises?

+0

Wow! Ausgezeichnete Antwort, danke, – bniwredyc

Verwandte Themen