JQuery.post().done() и успех:
jQuery
документация по jQuery.post( )
// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.post( "example.php", function() {
alert( "success" );
})
.done(function() {
alert( "second success" );
})
.fail(function() {
alert( "error" );
})
.always(function() {
alert( "finished" );
});
// Perform other work here ...
// Set another completion function for the request above
jqxhr.always(function() {
alert( "second finished" );
});
В чем разница между параметром success:
и методом jqXHR.done( )
; если его нет, какова вся точка метода jqXHR.done( )
?
Ответы
Ответ 1
jQuery используется ТОЛЬКО для функций обратного вызова для success
и error
и complete
.
Затем они решили поддерживать promises с помощью объекта jqXHR и что когда они добавили .done()
, .fail()
, .always()
и т.д.... в духе API обещаний. Эти новые методы выполняют те же самые цели, что и обратные вызовы, но в другой форме. Вы можете использовать любой стиль API, который лучше подходит для вашего стиля кодирования.
Поскольку люди все больше знакомы с promises, и поскольку все больше и больше асинхронных операций используют эту концепцию, я подозреваю, что с течением времени все больше людей перейдут на API обещаний, но тем временем jQuery поддерживает оба.
Метод .success()
устарел в пользу имен метода общих обещаний объектов.
Из jQuery doc вы можете увидеть, как различные методы обещаний относятся к типам обратного вызова:
jqXHR.done(функция (data, textStatus, jqXHR) {}); Альтернатива построить для опции обратного вызова успеха, метод .done() заменяет устаревший метод jqXHR.success(). Обратитесь к разделу deferred.done() для подробности реализации.
jqXHR.fail(функция (jqXHR, textStatus, errorThrown) {});альтернативная конструкция для опции обратного вызова ошибки, метод .fail() заменяет устаревший метод .error(). Обратитесь к разделу deferred.fail() для подробности реализации.
jqXHR.always(функция (данные | jqXHR, textStatus, jqXHR | errorThrown) { }); Альтернативная конструкция для полной опции обратного вызова,.always() заменяет метод устаревших .complete().
В ответ на успешный запрос аргументы функции такие же как .done(): data, textStatus и объект jqXHR. Для неудачные запросы, аргументы те же, что и аргументы .fail(): объект jqXHR, textStatus и errorThrown. Обратитесь к отложенному.()() для деталей реализации.
jqXHR.then(функция (data, textStatus, jqXHR) {}, функция (jqXHR, textStatus, errorThrown) {}); Включает функции .done() и .fail(), позволяя (по jQuery 1.8) основополагающее обещание манипулировать. Обратитесь к отложенному .then() для подробности реализации.
Если вы хотите закодировать таким образом, который более соответствует стандарту ES6 promises, то из этих четырех параметров вы бы использовали только .then()
.
Ответ 2
Причиной предпочтения Promises над функциями обратного вызова является наличие нескольких обратных вызовов и устранение таких проблем, как Callback Hell.
Обратный звонок (для получения дополнительной информации см. http://callbackhell.com/):
Асинхронный javascript или javascript, который использует обратные вызовы, трудно получить правильно интуитивно. Много кода заканчивается следующим образом:
asyncCall(function(err, data1){
if(err) return callback(err);
anotherAsyncCall(function(err2, data2){
if(err2) return calllback(err2);
oneMoreAsyncCall(function(err3, data3){
if(err3) return callback(err3);
// are we done yet?
});
});
});
С Promises выше код можно переписать следующим образом:
asyncCall()
.then(function(data1){
// do something...
return anotherAsyncCall();
})
.then(function(data2){
// do something...
return oneMoreAsyncCall();
})
.then(function(data3){
// the third and final async response
})
.fail(function(err) {
// handle any error resulting from any of the above calls
})
.done();
Ответ 3
Оба .done()
и .success()
являются функциями обратного вызова, и они по существу функционируют одинаково.
Здесь документация. Разница в том, что .success()
устарел от jQuery 1.8. Вместо этого вы должны использовать .done()
.
Если вы не хотите нажимать на ссылку:
Уведомление об отставке
Обратный вызов jqXHR.success()
, jqXHR.error()
и jqXHR.complete()
методы, введенные в jQuery 1.5, устарели из jQuery 1.8. к подготовьте код для их возможного удаления, используйте jqXHR.done()
, jqXHR.fail()
и jqXHR.always()
.
Ответ 4
Из документа:
jqXHR.done(функция (data, textStatus, jqXHR) {});
Конструкция альтернатива для опции обратного вызова успеха,.done() метод заменяет метод устаревший jqXHR.success(). Ссылаться на deferred.done() для деталей реализации.
Точка - это просто альтернатива для опции обратного вызова успеха, а jqXHR.success()
устарела.