2013-08-16 1 views
6

Ich bin verwirrt über die Verwendung der Option async: false mit $ .ajax(). Entsprechend der $ .ajax() - Dokumentation:

Ab jQuery 1.8 ist die Verwendung von async: false mit jqXHR ($. Delerent) veraltet; Sie müssen die success/error/complete Callback-Optionen anstelle der entsprechenden Methoden des jqXHR-Objekts wie jqXHR.done() oder der veraltete jqXHR.success() verwenden.

Ich weiß nicht, was jqXHR ($ .Laut) bedeutet. Verwendet async: false aus irgendeinem Grund abgeschrieben, oder ist jqXHR ($ .Deferred) eine Art besonderer Anwendungsfall?

frage ich, als ich Probleme habe ein $ Schnipsel bekommen() aufrufen asynchronously.This geschehen ist mit jQuery 1.8.2:

var ret = {}; 

$.ajax({ 
    async:   false, 
    method:   'GET', 
    contentType: 'application/json', 
    dataType:  'jsonp', 
    url:   '/couchDBserver', 
    error:   myerr, 
    success:  function(data) { 

     var rows = data.rows; 

     //something that takes a long time 
     for(var row in rows) { 
      ret[rows[row].key] = rows[row].value; 
     } 

     console.log('tick'); 
    } 
}); 
console.log('tock'); 
console.log(JSON.stringify(ret)) 

Meine Konsolenausgabe ist:

tock
{}
tick

ich etwas falsch tue, oder bin ich doi ng etwas falsch?

+0

Ich würde den 'tock'-Code und alles andere, was benötigt wird, um nach der Ajax-Anfrage in der' success'-Funktion ausgeführt werden. Async AJAX ist ein wenig schlampig. – MattDiamant

+0

Ich nehme an, dass es unmöglich ist, eine synchronisierte 'JSONP' Anfrage zu erstellen, da es überhaupt kein' AJAX' ist. Ich sehe, dass Sie Daten von demselben Ursprung laden, irgendeinen Grund, 'JSONP' zu verwenden? – Tommi

+0

Ich verstehe das und es ist etwas, das ich in der Vergangenheit zu vermeiden versucht habe. Ich habe jedoch oft einen Spagetti-Code, der im Wesentlichen versucht, synchrone Anfragen zu stellen. Manchmal müssen Sie eine Anfrage machen, die Ergebnisse bewerten und dann eine weitere Anfrage basierend auf Ihrer Einschätzung (ad infinitum) machen. Gibt es etwas, was ich nicht über $ .ajax() verstehe, das synchrone Anfragen zu einer schlechten Sache macht? Gibt es eine andere Bibliothek, die ich verwenden sollte, um in diesen Situationen 'GET', 'POST' und 'PUT' Anfragen zu stellen? – ddouglascarr

Antwort

3

Sie versuchen, JSONP techinque mit async: false gleichzeitig zu verwenden. Das ist nicht möglich.JSONP erstellt tatsächlich ein script-Element und hängt es irgendwo an das Dokument an, sodass es kein XHR ist und jQuery das Synchronisierungskennzeichen nirgends weitergeben kann. Da Sie Daten aus dem gleichen Ursprung zu erhalten, nur Datentyp

ändern
dataType:  'json', 

aber jeder kann Ihnen sagen, dass synchrone Anforderungen sie hängen Ihren Browser nicht gut sind. Sie sollten sie nur in einer kleinen Anzahl von Fällen verwenden.

10

, was es sagen will, ist, wenn Sie Ihre Anfrage async: false ist, dann sollten Sie nicht ajax.done(), ajax.fail() etc Methoden verwenden, um die Callback-Methoden zu registrieren, anstatt Sie die Callback-Methoden verwenden success/error/complete Optionen zum Ajax-Aufruf

übergeben müssen korrekte

$.ajax({ 
    async: false, 
    success: function(){ 
    }, 
    error: function(){ 
    }, 
    complete: function(){ 
    } 
}) 

falsch

$.ajax({ 
    async: false 
}).done(function(){ 
}).fail(function(){ 
}).always(function(){ 
}) 

wenn Asynchron: true // nicht

angegeben

korrekte

$.ajax({ 
}).done(function(){ 
}).fail(function(){ 
}).always(function(){ 
}) 

oder

$.ajax({ 
    async: false, 
    success: function(){ 
    }, 
    error: function(){ 
    }, 
    complete: function(){ 
    } 
}) 
3

Das Deferred Objekt in jQuery behandelt promises in AJAX. Wie es ist, würde async: false den Begriff der asynchronen Aufrufe, für die Sie Versprechungen behandeln müssen, vollständig durchbrechen.

Was das jQuery Doc-Snippet Ihnen sagt, ist, dass so etwas verboten wäre.

$.ajax({ 
    async: false, 
    /*rest of the options*/ 
}).done(function(){ 
    //do something after the response comes back successfully 
}); 

jedoch Optionen Rückruf Befestigung ist vollständig gültig und ist der einzige Weg, AJAX verwenden mit async: false.

$.ajax({ 
    async: false, 
    /*Rest of the options*/ 
    success: function(){ 
       console.log("foo"); 
      } 
}); 
Verwandte Themen