将多个done()回调链接到相同的延迟保证

时间:2014-10-23 14:20:16

标签: jquery promise

简而言之,我希望有一个一般的回调,在成功的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/

1 个答案:

答案 0 :(得分:14)

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

  

回调按照添加顺序执行。

它在其他承诺库中的工作方式不同,通常.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。一般来说,我只使用.done来终止链,如果你想保留返回值(function(){的参数)