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( )?


person KaekeaSchmear    schedule 06.03.2014    source источник


Ответы (4)


jQuery раньше имел ТОЛЬКО функции обратного вызова для success и error и complete.

Затем они решили поддерживать промисы с помощью объекта jqXHR, и именно тогда они добавили .done(), .fail(), .always() и т. д. в духе промисов API. Эти новые методы служат той же цели, что и обратные вызовы, но в другой форме. Вы можете использовать любой стиль API, который лучше подходит для вашего стиля кодирования.

По мере того, как люди все больше и больше знакомятся с промисами и все больше и больше асинхронных операций используют эту концепцию, я подозреваю, что со временем все больше и больше людей перейдут на промис API, но пока что jQuery поддерживает и то, и другое.

Метод .success() устарел в пользу общих имен методов объектов обещаний.

Из документа по jQuery вы можете увидеть, как различные методы promise связаны с типами обратного вызова:

jqXHR.done(function( data, textStatus, jqXHR ) {}); Альтернативная конструкция опции обратного вызова, метод .done() заменяет устаревший метод jqXHR.success(). Обратитесь к deferred.done() для деталей реализации.

jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {}); Альтернативная конструкция для опции обратного вызова ошибки, метод .fail() заменяет устаревший метод .error(). Обратитесь к deferred.fail() для деталей реализации.

jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { }); Альтернативная конструкция опции полного обратного вызова, метод .always() заменяет устаревший метод .complete() .

В ответ на успешный запрос аргументы функции те же, что и у .done(): данные, textStatus и объект jqXHR. Для неудачных запросов аргументы такие же, как у .fail(): объект jqXHR, textStatus и errorThrown. Обратитесь к deferred.always() для деталей реализации.

jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {}); Включает функциональные возможности методов .done() и .fail(), позволяя (начиная с jQuery 1.8) управлять базовым обещанием. Обратитесь к deferred.then() для деталей реализации.

Если вы хотите кодировать так, чтобы он больше соответствовал стандарту ES6 Promises, то из этих четырех вариантов вы должны использовать только .then().

person jfriend00    schedule 06.03.2014

Причина предпочтения промисов над функциями обратного вызова состоит в том, чтобы иметь несколько обратных вызовов и избежать таких проблем, как 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?
        });
    });
});

С обещаниями выше код можно переписать следующим образом:

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();
person manish khandelwal    schedule 26.01.2015

И .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().

person royhowie    schedule 06.03.2014

Из документа:

jqXHR.done(функция(данные, textStatus, jqXHR) {});

Альтернатива конструкции для опции обратного вызова успеха, метод .done() заменяет устаревший метод jqXHR.success(). Обратитесь к deferred.done() для деталей реализации.

Дело в том, что это просто альтернатива для опции обратного вызова успеха, а jqXHR.success() устарела.

person xdazz    schedule 06.03.2014