我用:
var jqXHR = $.ajax(settings);
jqXHR.success(function(result){});
jqXHR.error(function(result){});
jqXHR.complete(function(result){});
但是 1.5 版本添加了延迟对象。
Q:一般来说,你什么时候使用success、error和complete方法,而不是deferred then、done和fail的新热度?
我用:
var jqXHR = $.ajax(settings);
jqXHR.success(function(result){});
jqXHR.error(function(result){});
jqXHR.complete(function(result){});
但是 1.5 版本添加了延迟对象。
Q:一般来说,你什么时候使用success、error和complete方法,而不是deferred then、done和fail的新热度?
For $.ajax()
and family.success
只是 Deferred's 的同义词.done
,同样.error
也是 的同义词.fail
。
所以实际上您展示的示例已经是延迟方法,但名称不同。
.complete
主要是新的 jQuery 1.6 的同义词,.always
使用 可以得到相同的效果,无论 AJAX 调用成功与否$.then(cb, cb)
都会导致被调用。我相信在,和变体cb
之间传递给“失败”回调的参数存在细微差别。.complete
.always
$.then
我个人更喜欢使用那些命名函数的 Deferred 版本,因为这样你就不必担心你的 deferred 对象是否是 jqXHRs。只有,和, 但每个Deferred (包括 jqXHRs)jqXHRs
都有,和..success
.error
.complete
.done
.fail
.always
编辑似乎 jQuery 开发人员同意我的看法 - 他们已经宣布,并将在 jQuery 1.8 中.success
弃用.error
.complete
Deferred 旨在取代 jqXHR 并将成功和错误的概念抽象到 ajax 之外。
快速浏览源代码:jQuery 1.6.1
// completeDeferred is resolved in only one place.
completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
deferred.promise( jqXHR ); // this attaches the promise methods to jqXHR
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
jqXHR.complete = completeDeferred.done;
我制作了一个奶酪幻灯片来说明延迟是如何有用的。