jQuery延迟对象和承诺 - .then() vs .done()

521
我一直在阅读有关jQuery延迟对象(deferreds)和承诺(promises),但我无法看出在成功回调中使用.then().done()之间的区别。我知道Eric Hynds提到.done().success()映射到相同的功能,但我猜.then()也是如此,因为所有回调都在成功操作完成后被调用。
请问有人可以启示我正确的用法吗?

15
请注意,JQuery 3.0于2016年6月发布,是符合Promises/A+和ES2015 Promises规范的第一个版本。在此之前的实现与Promise所应提供的功能存在不兼容性。 - Flimm
我更新了我的回答,提供了更好的建议,告诉你什么时候使用。 - Robert Siemer
12个回答

0
我正在使用jquery_3.5.1,这在jQuery.post函数中完美地运作。我只需要在函数末尾添加 'then' promise 即可。
这是w3c网站上promise文档的链接: https://www.w3schools.com/js/js_promise.asp 以下是我使用jQuery.post的代码片段,希望对您有所帮助。
$.post('../endPoint/employers/employerFindCandidateByPublicId.php', {
    param: param
}).done(function (data) {
    //..Your Stuff here
}).then(successCallback, failCallback);

function successCallback() {
    alert('Success');
}

function failCallback() {
    alert('Failed');
}

-4

.done() 终止了 Promise 链,确保没有其他步骤可以附加。这意味着 jQuery 的 Promise 实现可以抛出任何未处理的异常,因为没有人可以使用 .fail() 处理它。

实际上,如果您不打算将更多步骤附加到 Promise 上,您应该使用 .done()。有关更多详细信息,请参见 为什么需要完成承诺


7
注意!这个答案对于多种 Promise 实现是正确的,但不适用于 jQuery,因为 .done() 在其中没有终止作用。文档说:“由于 deferred.done() 返回 deferred 对象,因此可以链接到该方法的其他 deferred 对象方法,包括额外的 .done() 方法。”.fail() 没有被提到,但是确实也可以链式调用。 - Roamer-1888
2
我的错,没有检查jQuery。 - gleb bahmutov
2
@glebbahmutov - 也许你应该删除这个答案,以免其他人感到困惑?只是一个友好的建议 :) - Andrey
3
请不要删除答案,这可以帮助人们澄清他们的误解。 - Melissa
不要删除(错误的)答案,更新它并解释为什么是错误的会更有意思。这样可以避免被踩扁 ;) - AFract

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接