Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 将多个done()回调链接到同一延迟承诺_Jquery_Promise - Fatal编程技术网

Jquery 将多个done()回调链接到同一延迟承诺

Jquery 将多个done()回调链接到同一延迟承诺,jquery,promise,Jquery,Promise,简言之,我希望有一个通用回调,在成功调用ajax时总是触发,然后根据调用方法的位置提供单独的回调功能 这似乎奏效了。我的问题是,这是否是对promise对象的正确使用,是否可以安全地假设相同类型的多个promise回调总是按顺序堆叠 var dfd = $.Deferred(), promise = dfd.promise(); promise.done(function(){ console.log(1); }).done(function(){ console.lo

简言之,我希望有一个通用回调,在成功调用ajax时总是触发,然后根据调用方法的位置提供单独的回调功能

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

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

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

dfd.resolve();

这是jQuery中延迟对象的正确且有文档记录的用法。文件:

回调按添加顺序执行

它在其他promise库中的工作方式有所不同,通常是
。然后无论怎样,
都比
。done
更可取(在后面的回答中解释)。然而,如果您使用jQuery,那么如果它们是同步的,它将按顺序进行堆栈

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

但是,您也可以使用异步代码来实现这一点,并使用
使其更好地链接

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
添加一个处理程序并返回相同的承诺和
。然后
返回上一个承诺链接的新承诺。通常,我只会使用
.done
来终止链,如果希望保留返回值(
函数()的参数{

我希望你能找到这个主题;)当你说
一般来说。那么是首选。无论如何做
我想你指的是链接,而不是
done
vs
then
一般来说?我想根据你的评论,最合适的方法是使用
then()
然后加上“终止”
done()
,即使在这种情况下我只处理同步代码?@Johan在使用新的promise库时,一般来说,我更喜欢
然后
而不是
完成
。另一方面,在jQuery中,使用
.done
终止链是有益的-所以是的,这不是jQuery承诺的最大问题。同意。谢谢为了让我了解两者之间的区别!您所说的“它在其他promise库中的工作方式不同”是什么意思?Promises/A+也指定按调用的顺序执行回调(使用我的upvote直到澄清为止:-)@jQuery
.done
中的Bergi接受回调并返回相同的承诺。在其他库中,如Q和Bluebird
。done
不接受任何内容,也不返回任何内容。在jQuery中,它用于将处理程序链接到结果-在中的其他库中,终止承诺链并记录任何未经处理的拒绝-jQuery不我在承诺中很好地处理拒绝。我想这就是我的意思。