2012-11-30 11 views
6

Ich habe einige Probleme mit der Ajax-Fehlerfunktion, die aufgerufen wird, während das Skript eine Weile dauert, zu laden. Aber ich konnte es beheben, indem ich async: false hinzufüge.

Z. B:

$.ajax({ 
    type: 'POST', 
    url: REQUEST_URL, 
    async: false, 
    data: { 
     'id': id 
    }, 
    dataType: 'json', 
    success: function(output) { 
     // success 
    }, 
    error: function() { 
     alert('Error, please refresh the page'); 
    } 
}); 

Wenn Sie die Dokumentation zu lesen steht:

Standardmäßig werden alle Anfragen asynchron gesendet (das heißt, dies zu true per Default eingestellt ist). Wenn Sie synchrone Anforderungen benötigen, setzen Sie diese Option auf false. Domänenübergreifende Anfragen und dataType: "jsonp" -Anforderungen unterstützen nicht synchronen Betrieb. Beachten Sie, dass synchrone Anfragen den Browser temporär sperren können und alle Aktionen deaktivieren, während die Anfrage aktiv ist. Ab jQuery 1.8 ist die Verwendung von async: false mit jqXHR ($ .Deferred) veraltet; Sie müssen die vollständigen/success/error Rückrufe verwenden.

Q) Was ist der letzte Teil über jqXHR bedeuten ($ .Deferred)? Beeinflusst das mein Skript?

Antwort

5

Es hat keinen Einfluss auf Ihr Skript.

Es bedeutet, dass, wenn synchrone Anforderungen AJAX durchgeführt wird, sollte man die deferred API von dem durch $.ajax() (wie done() oder fail() zum Beispiel) zurückgegebene Objekt ausgesetzt verwenden, sondern verlassen sich auf den complete und error Handler statt.

Mit anderen Worten, Ihr Code verwendet bereits das richtige Muster. Sie müssten es ändern, wenn es verzögerte Operationen wie verwendet:

// Do not write this code. 
$.ajax({ 
    type: 'POST', 
    url: REQUEST_URL, 
    async: false,   // <-- Synchronous request. 
    data: { 
     'id': id 
    }, 
    dataType: 'json' 
}).done(function(output) { // <-- Use of deferred method. 
    // success 
}).fail(function() {  // <-- There also. 
    alert('Error, please refresh the page'); 
}); 
+0

danke, wollte nur sicherstellen, dass mein Code in zukünftigen jquery nicht brechen würde –