有没有办法在另一个“可能”存在的模块中触发调用方法?

时间:2014-05-14 14:27:28

标签: javascript jquery promise

我知道这是一个基本问题......但我会尝试解释。

我一直在使用延期,但有人指出我将其用作反模式。 基本上,我可以在子模块中使用deferred。但如果这是一个反模式,那么实现这一目标的最佳方法是什么?#34;子模块"可能不在那里..所以,我不想在父ajax调用的成功中显式调用子方法。

所以,有三个问题:

  1. 这是一种可行的方式,如果不是 - 有什么方法可以实现我想要的目标?

  2. 即使我正在重置延期,但它似乎并未重置'。为什么呢?

  3. CAN也可以实现与其他事件的耦合 - 即onload。 SO<我们有ajax和onload做同样的事情。

  4. 我有一个父模块。

    var Z = {};
    
    Z.someVar = $.Deferred();
    
    Z.a = function(){
        //methods
    
        //Ajax call on page: can be once or multiple calls.
        $AJAX = {
            url:...,
            dataType: ...,
            //etc..
        }.success(
          function(){
             Z.someVar.resolve();
          }
        ).error();
    
    
    };
    
    // another method that MIGHT exist.
    
    Z.b = function(){
       var func1 = function(){
           // do some stuff
           Z.someVar = $.Deferred(); // reset it.
       }
       Z.someVar.done(function(){
          func1();
       })
    }
    

1 个答案:

答案 0 :(得分:2)

承诺是对单个,一次计算值的抽象。承诺开始待定,然后可以转换为已履行已拒绝状态。一旦承诺解决(转换),它就永远不会再改变它的状态。

延迟只用于一个 - 当你想要从不是承诺*的东西构建承诺时。

在jQuery $.ajax已经返回一个承诺开始。

Z.a = function(){ // this method now returns a promise
    return $.ajax({...});
};

如果我们想将其链接起来,我们可以使用.then

Z.a().then(function(){
    // here a() is done.
});

您还可以使用$.when(大多数承诺库中的Promise.resolve)使用缓存模式:

Z._a = null;
Z.a = function(){
    if(z._a){ // already have the value cached:
        return $.when(z._a); // promise over the value
    }
    return $.ajax({...}).then(function(res){
        Z._a = res;
        return res; // chain
    });

};

Z.b = function(){
    return Z.a().then(function(aValue){
        // do something with value, your return value here is the resolution
        // value of the a method call.
    });
}

现在,如果您想等待多个来电,可以使用$.when多个承诺并获得结果。

还有其他非常罕见的聚合用例