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!

War es hilfreich?

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 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top