gpt4 book ai didi

javascript - 有没有办法触发调用另一个模块中存在 "might"的方法?

转载 作者:行者123 更新时间:2023-11-30 17:28:44 27 4
gpt4 key购买 nike

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

我一直在使用 Deferred,但有人指出我将其用作反模式。基本上,我可以在子模块中使用 deferred。但是,如果这是一种反模式,那么实现这一目标的最佳方法是什么,其中“子模块”可能不存在。所以,我不想在父 ajax 成功时显式调用子方法打电话。

那么,三个问题:

  1. 这是可行的方法吗?如果不是,什么是实现我的目标的好方法?

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

  3. 这也可以通过与另一个事件(即 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();
})
}

最佳答案

Promise 是对值的单次 计算的抽象。 promise 从pending 开始,然后可以转换为fulfilledrejected 状态。一旦一个 promise 解决(转换)它就永远不能再改变它的状态。

Deferreds 只用在一个地方——当你想从不是 promise* 的东西构造一个 promise 时。

在 jQuery 中,$.ajax 已经返回开始的 promise 。

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

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

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

您还可以使用缓存模式,使用 $.when(大多数 promise 库中的 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 与多个 promise 一起使用并获得它们的结果。

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

关于javascript - 有没有办法触发调用另一个模块中存在 "might"的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23657518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com