17

我用:

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的新热度?

4

2 回答 2

17

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

于 2011-06-08T21:22:09.683 回答
9

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;

我制作了一个奶酪幻灯片来说明延迟是如何有用的。

于 2011-06-22T21:13:20.520 回答