Verbinde 2 'threads' in Javascript

8

Wenn ich einen Ajax-Anruf abrufe (mit einem Rückruf) und dann irgendeinen anderen Code, der in der Zwischenzeit läuft. Wie kann ich eine dritte Funktion haben, die aufgerufen wird, wenn beide der ersten 2 fertig sind. Ich bin mir sicher, dass es einfach ist, mit polling (setTimeout und überprüfen Sie einige Variablen), aber ich würde lieber einen Rückruf.

Ist es möglich?

    
Paul Tarjan 30.05.2009, 11:50
quelle

6 Antworten

14

Sie können sowohl Ihrem AJAX-Aufruf als auch Ihrem anderen Code, der in der Zwischenzeit ausgeführt wird, denselben Callback geben. Verwenden Sie eine Variable, um deren kombinierten Fortschritt zu verfolgen, und verknüpfen Sie sie anschließend mit einem Rückruf wie folgt:

%Vor%     
Daniel Lew 30.05.2009, 11:54
quelle
4

Daniels Lösung ist die richtige. Ich nahm es und fügte zusätzlichen Code hinzu, damit Sie nicht zu viel nachdenken müssen;)

%Vor%     
Helgi 30.05.2009 12:15
quelle
3

Der beste Ansatz dazu ist, die Tatsache zu nutzen, dass Funktionen Objekte erster Ordnung in JavaScript sind. Daher können Sie sie Variablen zuweisen und sie über die Variable aufrufen, indem Sie die Funktion, auf die sich die Variable bezieht, nach Bedarf ändern.

Zum Beispiel:

%Vor%

Wenn beide Code-Teile jetzt die Variable verwenden, um die Funktion aufzurufen:

%Vor%

Dann ruft der erste Aufruf zuerst den ersten Callback auf, der die Variable so ändert, dass sie auf den zweiten Callback zeigt, und wird somit von demjenigen aufgerufen, der als zweiter ausgeführt wird.

Aber Ihre Formulierung der Frage impliziert, dass dies alles unnötig sein könnte, da es sich anhört, als würden Sie eine Ajax-Anfrage machen und dann die Verarbeitung fortsetzen. Da JavaScript-Interpreter single-threaded sind, wird der Ajax-Callback niemals ausgeführt, bis der Hauptteil des Codes, der die Anfrage ausgeführt hat, trotzdem ausgeführt wurde, auch wenn dies lange nach dem Empfang der Antwort ist.

Falls das nicht Ihre Situation ist, habe ich ein Arbeitsbeispiel auf meiner Website erstellt ; Sehen Sie sich die Quelle an, um den Code zu sehen (kurz vor dem Tag & lt; / body & gt;). Es macht eine Anfrage, die vom Server für ein paar Sekunden verzögert wird, dann eine Anfrage, die eine sofortige Antwort erhält. Die Antwort der zweiten Anfrage wird von einer Funktion behandelt, und die Antwort der ersten Anfrage wird später von einer anderen Funktion behandelt, da die Anfrage, die zuerst eine Antwort erhalten hat, die Rückrufvariable geändert hat, um auf die zweite Funktion zu verweisen.

    
NickFitz 30.05.2009 18:26
quelle
3

Sie sprechen über eine Sache, die in Javascript als "@chris Conway" bezeichnet wird. In ähnlicher Weise hat jQuery auch seit Version 1.5 Deferred.

Überprüfen Sie diese Deferred.when () oder deferred.done ()

Vergessen Sie nicht, jQuery doc zu überprüfen.

Aber um Ihnen eine Idee zu geben, was ich von dieser Seite kopiere,

%Vor%

// Verwenden von deferred.then ()

%Vor%     
samarjit samanta 01.06.2012 07:14
quelle
0

So etwas (schematisch):

%Vor%     
Thevs 30.05.2009 14:32
quelle
0

Sie können dies ganz einfach mit der Closure-Bibliothek von Google machen, insbesondere %Co_de% :

%Vor%

Sie können mehrere asynchrone Berechnungen mit goog.async.Deferred , awaitDeferred oder chainDeferred verknüpfen.

    
Chris Conway 30.05.2012 19:59
quelle