Javascript 是否有方法触发调用另一个模块中的方法;“可能”;存在?
我知道这是个卑鄙的问题。。。但我会尽力解释的 我一直在使用延迟模式,但有人指出我将其用作反模式。 基本上,我可以在子模块中使用deferred。但是,如果这是一种反模式,那么在“子模块”可能不存在的情况下,实现这一点的最佳方法是什么。。因此,我不想在父ajax调用成功时显式调用子方法 因此,有三个问题:Javascript 是否有方法触发调用另一个模块中的方法;“可能”;存在?,javascript,jquery,promise,Javascript,Jquery,Promise,我知道这是个卑鄙的问题。。。但我会尽力解释的 我一直在使用延迟模式,但有人指出我将其用作反模式。 基本上,我可以在子模块中使用deferred。但是,如果这是一种反模式,那么在“子模块”可能不存在的情况下,实现这一点的最佳方法是什么。。因此,我不想在父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.
});
}