是否有触发调用的方法在另一个模块,“可能”存在的方式吗?(Is there a way to tri

2019-10-20 03:11发布

我知道这是一个基础的问题...但我会尽量解释。

我一直在使用一个延迟,但有人指出,我使用它作为一个反模式。 基本上,我可以使用子模块中的延迟。 但如果这是一个反模式,什么是实现这一目标中,“子模块”未必有最好的方式..所以,我不想显式调用子方法在父阿贾克斯成功呼叫。

所以,三个问题:

  1. 这是一个可行的办法,如果不是 - 什么是要实现什么,我去一个好办法吗?

  2. 即使我重置递延,它不似乎“重置”。 为什么?

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

我有一个父模块。

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

Answer 1:

甲诺超过一个值的一个单一的,一个时间计算的抽象。 一诺开始之前 ,然后可以过渡到既履行拒绝状态。 一旦解决了承诺(转变),它永远不能再改变它的状态。

Deferreds在只有一个使用 - 当你想构建从一些承诺,这不是一个承诺*。

在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有多个承诺,并得到他们的结果。

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



文章来源: Is there a way to trigger call a method in another module that “might” exist?