如何从JavaScript函数返回一个promise?

时间:2014-07-10 09:30:51

标签: javascript jquery promise jquery-deferred deferred

想象一下,我有XYZ个函数,都返回了承诺并准备链接。我想要做的是在完成后通知进度并处理错误。什么是更好的写作和为什么(后果是什么):

一个。

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);
           }
        );
}

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部分是不必要的,为什么它在jQuery中存在呢?

2 个答案:

答案 0 :(得分:0)

后者是不必要的。这只是额外的瑕疵。 $.when对于将值转换为promise和聚合非常有用。

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

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

您可以在此处使用这两个结果,两者都已完成。

关于第一个问题 - 基本上B.第一个选项是deferred anti pattern,最好避免使用。请参阅link to it有关原因的问题。

答案 1 :(得分:0)

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