syntax für Jquery.aufgeschoben , synchrone Funktionsrückgabe versprechen lassen
-
11-12-2019 - |
Frage
Eine kurze Frage zur Verwendung von Jquery.verzögert, damit eine langsame synchrone Funktion stattdessen ein Versprechen zurückgibt.Was ich bisher gemacht habe, ist Folgendes :
function sayIt(ms) {
setTimeout( function() { console.log('what I say'); }, ms);
}
function doIt() {
return $.Deferred( function() { sayIt(2000); }).promise();
}
doIt().then( function() { console.log('ah'); });
der SayIt (2000) geht immer durch, aber die verkettete Funktion nach dem 'dann' wird nie ausgelöst.
Wenn ich das mache :
doIt().then( console.log('ah'));
das 'ah' kommt sofort und dann das 'was ich sage' 2000ms später - was ich will, ist natürlich das Gegenteil - dass ich nach zwei Sekunden 'was ich sage' und dann gleich danach 'ah' bekomme.
Irgendwelche Vorschläge geschätzt!
Lösung
etwas synchron zu tun, aber immer noch ein Versprechen verwenden, tun Sie: generasacodicetagpre.
Der Effekt ist, dass Sie immer noch ein Versprechen erhalten, aber dieses Versprechen ist bereits aufgelöst, sodass jeder generakodicetagcode, der anschließend darauf registriert ist, sofort erfolgt.
Der Vorteil dieses Musters besteht darin, dass, wenn Sie den synchronen Code anschließend durch etwas Asynchron der Funktion ersetzen, die Funktion noch dieselbe externe Schnittstelle hat.
Andere Tipps
Wenn Sie eine Funktion nach Ablauf des Timeouts ausführen möchten, müssen Sie Folgendes aufrufen resolve()
auf der Deferred
objekt aus der Timeout-Ablauffunktion:
function sayIt(ms) {
var d = $.Deferred();
setTimeout(function() {
console.log('what I say');
d.resolve()
}, ms);
return d;
}
Auf diese Weise beschränken Sie die Auflösung des Deferred
widersprechen Sie dem Ablauf des Timeouts.
Zu erreichen, was ich glaube, ist Ihre Absicht:
function doIt() {
return sayIt(2000).promise()
}
Der .promise()
anruf ist optional.Es schränkt nur die verfügbare Schnittstelle für Anrufer ein:durch Rückgabe eines Promise
anstelle des Originals Deferred
objekt kann der Aufrufer nur auf Ereignisse reagieren, diese aber nicht auslösen.Referenz: http://api.jquery.com/deferred.promise/.
Schließlich Ihr ursprünglicher Anruf:
doIt().then( function() { console.log('ah'); });
Wird ausgegeben:
// 2 seconds delay
what I say
ah