2013-05-09 4 views
11

Ich habe ein Gedankenexperiment. In meinem Code habe ich eine globale Variable sagen var changeMe; und ich mache ein paar Ajax Anrufe.Kann Javascript Ajax zu Deadlocks führen?

//call One -- third param is the callback function 
    ajaxFunction(url1, params,function(data){ 
     changeMe = data; 
    }); 

//call Two 
    ajaxFunction(url2, params,function(data){ 
     changeMe = data; 
    }); 

So changeMe Wert wird davon abhängen, welche Ajax beendet letzte, rufen, die den Anruf bedeutet, die letzte beendet den Wert überschreiben.

Was ist, wenn beide Anrufe genau bei zur gleichen Zeit enden, gleiche Zeitstempel?

Da Javascript single-threaded ist, werden wir normalerweise dieses Problem nicht bekommen, aber dies kann im Fall von setTimeout und Ajax Anrufe auftreten. Ich weiß nicht, wie ich dieses Problem präzise reproduzieren kann, also bleibt es immer noch ein Gedankenexperiment.

Also wie in Multi-Thread-Bedingungen wird ein Deadlock behandelt?

Ich ziehe eine Antwort wie changeMeurl1 sein wird oder url2 und eine klare Situation Erklärung ..

Vielen Dank im Voraus

+1

http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 –

+1

In JavaScript haben Sie nur einen einzigen Thread, so wird es sein kein Problem. – erikkallen

+0

@Ishank ... danke fr tht..aber ich habe nicht ein einfaches ans für dieses ... – Sarath

Antwort

13

Javascript hat eine Ereigniswarteschlange. Es bedeutet, dass es ALLE Ereignisse behandelt (vom Benutzer ausgelöste Ereignisse, setTimeout-Ereignisse, ajax gibt Ereignisse zurück) eins nach dem anderen, da sie kommen.

Sie können keine Annahmen über die Ausführungsreihenfolge machen, das ist definitiv nicht der richtige Weg. Das bedeutet nicht, dass Sie keine Synchronisation durchführen können. Zum Beispiel:

function processURLs() { 
    var url1 = "http://www.url1.com/"; 
    var url2 = "http://www.url2.com/"; 
    var data1 = null; 
    var data2 = null; 

    ajaxFunction(url1, params, function(data){ 
     data1 = data; 
     if(data2 !== null) { 
      process(data1, data2); 
     } 
    }); 

    ajaxFunction(url2, params, function(data){ 
     data2 = data; 
     if(data1 !== null) { 
      process(data1, data2); 
     } 
    }); 
} 

Sie haben gesagt, dass Javascript single-thread ist. Stimmt. Dieser Thread führt eine Schleife durch und löscht die Ereignisse aus dieser Warteschlange, wenn Ereignisse verarbeitet werden sollen.

Auch wenn die Aufrufe exakt zur gleichen Zeit und mit demselben Zeitstempel beendet wurden, wird einer dieser Ereignisse vor dem anderen in die Warteschlange eingereiht (weil Ihr System die Nachrichten in einer bestimmten Reihenfolge an den Javascript-Prozess übermittelt).

Wenn Sie wissen wollen, wie Sie JavaScript Timer mit diesem Ereignis Warteschlange arbeitet, ich die Lektüre tief empfehlen von John Resig's blog post about it

Wenn Sie mehr Informationen wünschen über wie Netzwerkereignisse an Ihren Browser übergeben werden (JavaScript) , sollten Sie über die OSI Model lernen.

Ihr Browser befindet sich beispielsweise in der OSI-Schicht 7 (Anwendung), aber die Reihenfolge der Netzwerkereignisse wird unten festgelegt (Ebenen 3 bis 6).

Also um die Antwort zusammenzufassen: niemand kann Ihnen sagen, changeMe wird url1 oder url2 sein. Javascript wird die Reihenfolge hier nicht entscheiden, es wird in tieferen Schichten entschieden (Ihre Netzwerkkarte, Ihr Betriebssystem, etc).

+1

Diese Antwort scheint jedoch einige verifizierbare und seriöse Referenzen in Ihrer Antwort zu enthalten unterstützen Sie Ihren Anspruch wäre ausgezeichnet. –

+1

@SamuelLiew: Ihr Kommentar wäre ausgezeichnet, wenn Sie sie nicht bei jeder Antwort kopiert und eingefügt hätten. –

+0

Abgesehen davon beantwortet http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 die Frage. –

5

In Javascript laufen asynchrone Operationen im Hintergrund, aber der gesamte JavaScript-Code, einschließlich Callbacks, läuft im Vordergrund-Thread. Es ist also von vornherein unmöglich, dass zwei Callbacks gleichzeitig ausgeführt werden.

Wenn die beiden asynchronen Vorgänge zur genau gleichen Zeit abgeschlossen werden, signalisieren beide gleichzeitig ihre Beendigung, und dann wählt der Javascript-Scheduler einen der beiden Callbacks aus, die zuerst ausgeführt werden sollen.

Welcher Callback zuerst ausgeführt wird, ist Implementierung und Betriebssystem spezifisch, für alle Absichten und Zwecke können Sie annehmen, dass es zufällig sein wird.

+0

Diese Antwort scheint jedoch solide, einschließlich einiger nachweisbar seriösen Referenzen in Ihrer Antwort zur Unterstützung Ihrer Behauptung wäre ausgezeichnet. –

Verwandte Themen