Es ist ein gemeinsames Muster Timeout von einigen asynchronen Funktion zu implementieren, DEFFERED/Versprechen mit:in JavaScript, wie ein Versprechen in Timeout zu wickeln?
// Create a Deferred and return its Promise
function timeout(funct, args, time) {
var dfd = new jQuery.Deferred();
// execute asynchronous code
funct.apply(null, args);
// When the asynchronous code is completed, resolve the Deferred:
dfd.resolve('success');
setTimeout(function() {
dfd.reject('sorry');
}, time);
return dfd.promise();
}
Jetzt haben wir einige asynchrone Funktion myFunc
und Griff Timeout genannt ausführen kann:
// Attach a done and fail handler for the asyncEvent
$.when(timeout(myFunc, [some_args], 1000)).then(
function(status) {
alert(status + ', things are going well');
},
function(status) {
alert(status + ', you fail this time');
}
);
OK, lassen Sie uns machen eine Wendung in dieser Geschichte! Stellen Sie sich vor, dass die myFunc
selbst gibt ein Versprechen (ANMERKUNG: versprechen, nicht verschoben, und ich kann es nicht ändern):
function myFunc(){
var dfd = new jQuery.Deffered();
superImportantLibrary.doSomething(function(data)){
if(data.length < 5){
dfd.reject('too few data');
}
else{
dfd.resolve('success!');
}
}, {'error_callback': function(){
dfd.reject("there was something wrong but it wasn't timeout");}
}});
return dfd.promise();
}
Nun, wenn ich myFunc
in timeout
wickeln, werde ich die Fähigkeit verlieren, um Fehler zu behandeln unterschiedliche dann Timeout. Wenn myFunc
Fortschritt Ereignisse emittieren, werde ich dies auch verlieren.
Also die Frage ist: Wie zu ändern timeout
Funktion, so dass es Funktionen akzeptieren Versprechen akzeptieren kann, ohne ihre Fehler/Fortschritt Informationen zu verlieren?
Ihre Primitiven falsch sind, müssen Sie es in zwei Stufen promisify zunächst - promisify die superImportantLibrary.doSomething Methode und erst dann das Versprechen Rückkehr auszuführen. Vermeiden Sie auch jQuery Versprechungen, sie sind schrecklich im Vergleich zu anderen Implementierungen. –
@BenjaminGruenbaum - Welche Implementierungen? Warum jQuery verspricht sind schrecklich? Was meinst du mit "deine Primitiven sind falsch"? Wie kann ich "superImportantLibrary.doSomething" promisifizieren, wenn es eine Bibliothek ist und nicht mein eigener Code? Kannst du einen Beispielcode schreiben, um zu erklären, was du damit meinst? – mnowotka
Ich hatte Angst, ich wäre nicht in der Lage, solche Behauptungen zu machen, ohne mich rechtfertigen zu müssen :) Also [wie man eine API in Versprechen umwandelt] (http://stackoverflow.com/questions/22519784/how-do- i-convert-an-existing-callback-api-zu-versprechen (konvertieren Sie die Bibliothek selbst), [deshalb jQuery defereds sind schlecht] (http://stackoverflow.com/questions/23744612/problems-inhärente-to -jquery-deferred/23744774 # 23744774) und [wie von domenic erklärt] (https://gist.github.com/domenic/3889970), wie für die Bibliothek, würde ich [Bluebird] (https: // github .com/petkaantonov/bluebird) –