2014-07-10 220 views
3

想象一下,我有X,YZ函数,所有函数都返回并准备好链接。我想要做的是在完成并处理错误后通知进度。什么是更好的写和为什么(有什么后果):如何从JavaScript函数返回承诺?

A.

function my_func(index, size){ 
    return X 
     .then(Y) 
     .then(Z) 
     .then(
      function(data){ 
       var dfd = new $.Deferred(); 
       dfd.notify("progress", index/size, 'OK'); 
       dfd.resolve(data); 
       return dfd.promise(); 
      }, 
      function(){ 
       return handleError(arguments, size, index); 
      } 
     ); 
} 

B.

function my_func(index, size){ 
    var dfd = new $.Deferred(); 
    X 
    .then(Y) 
    .then(Z) 
    .then(
     function(data){ 
      dfd.notify("progress", index/size, 'OK'); 
      dfd.resolve(data); 
     }, 
     function(){ 
      return handleError(arguments, size, index); 
     } 
    ) 
    return dfd.promise(); 
} 

此外,之间有什么区别:

X.then(Y).then(Z); 

和:

$.when(X).then(Y).than(Z); 

如果$.when一部分是不必要的,为什么doeas它在jQuery的存在呢?

+0

评论从@Benjamin Gruenbaum评论中删除。 –

+0

你说得对。对不起! –

回答

0

后者是不必要的。这只是额外的罪过。 $.when对于将值转换为承诺和聚合很有用。

这里是一个平均$.when用例:

$.when($.get(...),$.get(...)).then(function(firstResult,secondResult){ 
    // access both results here 
}); 

你可以在这里使用两个结果,都已经完成。

至于第一个问题 - 基本上B.第一个选项是deferred anti pattern,最好避免。关于为什么,请参阅link to it问题。

+0

感谢您的解释,我的问题的第一部分呢? – mnowotka

+0

@mnowotka对不起,我错过了 - 请参阅我最近的编辑。 –

+0

在这里同意@BenjaminGruenbaum,第二种方法看起来更干净,因为'my_func'函数可以正确包装里面发生的事情。但是......总而言之,我认为你错误地认为'.then()'链将按顺序发生,只有当'Y'被解析,那么'Z'才会发生。情况并非如此,在两种情况下,'.then()都会在'X'解析时发生。我也是在这个印象中,但看到这个JSFiddle(按第二个按钮):http://jsfiddle.net/vH84q/1/(编辑:让浏览器控制台打开,看看发生了什么。) – UweB

0

主要区别在于,您依靠的是X是具有方法then的对象。 将非延迟/承诺对象传递给$.when将视为解决Deferred,我个人更喜欢它,因为它使得函数之间的耦合更松散。

+0

一个更正确的术语可能会“实现”,它会将其视为已履行延期。 –

+0

我同意,但我实际上引用了jQuery API文档;)“...它将被视为已解决的Deferred ...”,请参阅http://api.jquery.com/jQuery.when/ – UweB

+0

相同评论在这里 - 我很欣赏'when'的用法的解释,但对我来说,我的问题的第一部分更重要:) – mnowotka