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

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

我一直在使用Deferred,但是有人指出我正在使用它作为反模式。 基本上,我可以在子模块中使用deferred。 但如果这是一个反模式,那么实现这个“子模块”可能不存在的最好方法是什么..所以,我不想在父ajax的成功中显式调用子方法呼叫。

那么,有三个问题:

  1. 这是否是一种可行的方式,如果不是 – 什么是实现我的目标的好方法?

  2. 即使我正在重置Deferred,它似乎并不是“重置”。 为什么?

  3. 也可以通过将其与另一个事件(即onload)耦合来实现。 所以<我们有ajax AND onload做同样的事情。

我有一个父模块。

var Z = {}; Z.someVar = $.Deferred(); Za = 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. Zb = function(){ var func1 = function(){ // do some stuff Z.someVar = $.Deferred(); // reset it. } Z.someVar.done(function(){ func1(); }) } 

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

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

在jQuery中, $.ajax已经返回一个开头的承诺。

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

如果我们想链接它,我们可以使用.then

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

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

 Z._a = null; Za = 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 }); }; Zb = function(){ return Za().then(function(aValue){ // do something with value, your return value here is the resolution // value of the a method call. }); } 

现在,如果你想等待多个电话,你可以使用$.when多个承诺并获得他们的结果。

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