Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否有方法触发调用另一个模块中的方法;“可能”;存在?_Javascript_Jquery_Promise - Fatal编程技术网

Javascript 是否有方法触发调用另一个模块中的方法;“可能”;存在?

Javascript 是否有方法触发调用另一个模块中的方法;“可能”;存在?,javascript,jquery,promise,Javascript,Jquery,Promise,我知道这是个卑鄙的问题。。。但我会尽力解释的 我一直在使用延迟模式,但有人指出我将其用作反模式。 基本上,我可以在子模块中使用deferred。但是,如果这是一种反模式,那么在“子模块”可能不存在的情况下,实现这一点的最佳方法是什么。。因此,我不想在父ajax调用成功时显式调用子方法 因此,有三个问题: 这是一个可行的方法吗?如果不是的话,什么是实现我目标的好方法 即使我正在重置延迟,它看起来也不是“重置”。为什么? 这也可以通过将它与另一个事件(即onload)耦合来实现。因此,

我知道这是个卑鄙的问题。。。但我会尽力解释的

我一直在使用延迟模式,但有人指出我将其用作反模式。 基本上,我可以在子模块中使用deferred。但是,如果这是一种反模式,那么在“子模块”可能不存在的情况下,实现这一点的最佳方法是什么。。因此,我不想在父ajax调用成功时显式调用子方法

因此,有三个问题:

  • 这是一个可行的方法吗?如果不是的话,什么是实现我目标的好方法

  • 即使我正在重置延迟,它看起来也不是“重置”。为什么?

  • 这也可以通过将它与另一个事件(即onload)耦合来实现。因此,<我们让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();
       })
    }
    

    承诺是对价值的一次性计算的抽象。承诺开始处于待决状态,然后可以转换为已履行状态或已拒绝状态。一旦承诺得到解决(转换),它就再也无法改变其状态

    延期仅用于一种情况——当你想从非承诺的东西中构建承诺时*

    在jQuery
    $中,ajax
    已经返回了一个开始的承诺

    Z.a = function(){ // this method now returns a promise
        return $.ajax({...});
    };
    
    如果我们想链接它,我们可以使用
    。然后

    Z.a().then(function(){
        // here a() is done.
    });
    
    您还可以使用缓存模式,使用
    $。当
    时(大多数Promise库中的Promise.resolve):

    现在,如果您想等待多个调用,您可以使用带有多个承诺的
    $.when
    ,并获得它们的结果


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

    谢谢Benjamin,感谢您抽出时间回答我的问题。还有一个问题——是否有一种方法可以在AJAX之外的另一个事件中合并触发。。例如,onload等。。基本上,来自ajax和其他一些事件的承诺。一个人如何可能将这两个行为耦合起来以执行相同的..即,在另一个模块中调用一个方法?@user1492442
    $.when(firstPromise,secondPromise)。然后(function(){…
    -这将等待多个承诺首先完成。OP似乎使用延迟的(“resetable”)来发出事件。在他的原始代码中,
    .a()
    不是从
    b()调用的
    ,但从其他地方-在某种程度上分离它们。似乎承诺可能不是解决他的问题的方法。@Bergi,如果这是一次事件的话。我认为这是一个完全可以接受的解决方案。我同意他的实际目标需要更清楚。谢谢你的检查。现在,我使用了我所拥有的方法来重构代码,我需要一点时间。我将在未来几天内更新。正如Bergi猜测的那样,我使用它作为某种“一次性”的工具。实际上,当我的ajax错误或加载页面时,我使用“.resolve()”。因此,每次我都重置var a=$.Deferred();Bergi是对的,我实际上不需要承诺,只需要使用它(解析)有点像发射器。
    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.
        });
    }