【问题标题】:Chaining multiple done() callbacks to the same deferred promise将多个 done() 回调链接到同一个延迟承诺
【发布时间】:2014-10-23 22:24:20
【问题描述】:

简而言之,我希望有一个在成功调用 ajax 的情况下始终触发的通用回调,然后根据调用方法的位置提供单独的回调功能。

这似乎有效。我的问题是,这是否是对 Promise 对象的正确使用,是否可以安全地假设同一类型的多个 Promise 回调总是按顺序堆叠?

var dfd = $.Deferred(),
    promise = dfd.promise();

promise.done(function(){
    console.log(1);
}).done(function(){
    console.log(2);
});

dfd.resolve();

http://jsfiddle.net/4ax4nxbh/

【问题讨论】:

    标签: jquery promise


    【解决方案1】:

    这是对 jQuery 中延迟对象的正确使用和记录。文档clearly states

    回调按照添加的顺序执行。

    它在其他 Promise 库中的工作方式不同,通常.then.done 更受欢迎(稍后在答案中解释)。但是,鉴于您使用的是 jQuery 承诺,如果它们是同步的,它将按顺序堆叠。

    所以你的问题的直接答案是肯定的。

    但是,您也可以使用 异步 代码执行此操作,并使用 .then 更好地链接:

    promise.then(function(){
        console.log(1);
    }).then(function(){
        console.log(2);
    }).then(function(){
        return $.get(...);
    }).then(function(){
        console.log(3); // this always executes after the $.get finishes.
    });
    

    基本上,done 添加了一个处理程序并返回相同的 Promise,而.then 返回一个新的 Promise,链接自上一个 Promise。一般来说,我只会使用.done 来终止链,如果你想保留返回值(function(){ 的参数)

    【讨论】:

    • 我希望你能找到这个话题 ;) 当你说 generally .then is preferred to .done anyway 我想你指的是链接,而不是 donethen 一般?我想根据您的评论最合适的方法是使用then(),后跟“终止”done(),即使在这种情况下我只处理同步代码?
    • @Johan 一般来说,在使用新的 promise 库时,我更喜欢 then 而不是 done。另一方面,在 jQuery 中,使用 .done 终止链是有益的 - 所以是的,那么这又不是 jQuery 承诺的最大问题。
    • 同意。感谢您让我了解两者之间的区别!
    • 它在其他 Promise 库中的工作方式不同”是什么意思? Promises/A+ 确实指定按照它们的then() 调用的顺序执行回调。 (等待我的支持,直到澄清:-)
    • @Bergi in jQuery .done 接受回调并返回相同的承诺。在 Q 和 Bluebird 等其他库中,.done 不接受任何内容,也不返回任何内容。在 jQuery 中,它用于将处理程序链接到结果 - 在其他库中终止承诺链并记录任何未处理的拒绝 - jQuery 在其承诺中并没有真正很好地处理拒绝。我想这就是我的意思。
    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2016-12-08
    • 2016-12-30
    • 2016-09-03
    • 2018-08-15
    相关资源
    最近更新 更多