如何从JavaScript函数返回承诺?

如何从JavaScript函数返回承诺?,javascript,jquery,promise,jquery-deferred,deferred,Javascript,Jquery,Promise,Jquery Deferred,Deferred,想象一下,我有X、Y和Z功能,所有这些功能都返回了承诺并准备好链接。我想做的是在完成后通知进度并处理错误。写什么更好?为什么(后果如何): A 或 B 此外,以下各项之间的区别是什么: X.then(Y).then(Z); 以及: 如果$。当部分是不必要的时,为什么不呢?因为它存在于jQuery中?后者是不必要的。这只是多余的原油$。当用于将值转换为承诺和聚合时 这是一个平均值$。当用例: $.when($.get(...),$.get(...)).then(function(firstRes

想象一下,我有
X
Y
Z
功能,所有这些功能都返回了承诺并准备好链接。我想做的是在完成后通知进度并处理错误。写什么更好?为什么(后果如何):

A

B

此外,以下各项之间的区别是什么:

X.then(Y).then(Z);
以及:


如果
$。当
部分是不必要的时,为什么不呢?因为它存在于jQuery中?

后者是不必要的。这只是多余的原油<代码>$。当
用于将值转换为承诺和聚合时

这是一个平均值
$。当
用例:

$.when($.get(...),$.get(...)).then(function(firstResult,secondResult){
     // access both results here
}); 
您可以在这里使用这两个结果,它们都已完成


至于第一个问题——基本上是B。第一个选择是正确的,最好避免。请参阅关于原因的问题。

主要区别在于,您依赖于
X
作为具有方法
然后
的对象。

将非延迟/承诺对象传递给
$。when
会将其视为已解决的
延迟的
,我个人更愿意这样做,因为这会使函数之间的耦合更加松散。

注释从@Benjamin Gruenbaum comment中删除。你是对的。对不起!一个更正确的术语可能是“已实现”,它会将其视为已实现的延迟。我同意,但我实际上引用了jQueryAPI文档;)“…这将被视为已解决的延迟…”,请参见此处的相同评论-我很欣赏解释
的用法,但对我来说,我问题的第一部分更重要:)谢谢你的解释,我问题的第一部分呢?同意@BenjaminGruenbaum的观点,第二种方法看起来更干净,因为
my_func
函数正确地包装了内部发生的事情。但是总而言之,我认为您的假设是错误的,即
.then()
链接将使事情按此顺序发生,只有
Y
得到解决,那么
Z
才会发生。事实并非如此,这两种情况下的所有
.then()
s都是在
X
解析时发生的。我也有这样的印象,但看到这个JSFIDLE(按第二个按钮):(编辑:打开浏览器控制台以查看发生了什么。)
X.then(Y).then(Z);
$.when(X).then(Y).than(Z);
$.when($.get(...),$.get(...)).then(function(firstResult,secondResult){
     // access both results here
});