我知道这是一个基本问题......但我会尝试解释。
我一直在使用延期,但有人指出我将其用作反模式。 基本上,我可以在子模块中使用deferred。但如果这是一个反模式,那么实现这一目标的最佳方法是什么?#34;子模块"可能不在那里..所以,我不想在父ajax调用的成功中显式调用子方法。
所以,有三个问题:
这是一种可行的方式,如果不是 - 有什么方法可以实现我想要的目标?
即使我正在重置延期,但它似乎并未重置'。为什么呢?
CAN也可以实现与其他事件的耦合 - 即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();
})
}
答案 0 :(得分:2)
承诺是对单个,一次计算值的抽象。承诺开始待定,然后可以转换为已履行或已拒绝状态。一旦承诺解决(转换),它就永远不会再改变它的状态。
延迟只用于一个 - 当你想要从不是承诺*的东西构建承诺时。
在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
多个承诺并获得结果。
还有其他非常罕见的聚合用例