分辨
我在jQuery 1.7.1中遇到$.Deferred
的问题。我认为从/当/失败等返回值的行为与我认为它应该是不同的。
这就是我要做的事情:
$.when(setInstall(true)).then('do something');
(这样可行,等待ajax请求)inInstallableRegion
的{{1}}。$df
检测到有错误,因此拒绝了this.inInstallableRegion
的承诺(这有效),我希望将其返回$df
。 我假设 setInstall
this.inInstallableRegion
的返回值作为$.done()
的结果返回(即在这种情况下被拒绝)。出于某种原因,它会拒绝this.inInstallableRegion
,但当我转到$df
时,它会运行setInstall
函数,而不是$.done
函数:..我错过了什么?
对不起,真的不能为此做一个jsfiddle:\想不出一种简化它的方法更多......我的大脑完全被炸了:|
这是两个功能:
$.fail
////////////////////////////////////////
this.setInstall = function (status) {
$df1 = new $.Deferred();
if (status === true) {
var self = this;
return $.when(this.inInstallableRegion()).done(function (json) {
self.setInstallDetail(json);
self.setDispatchCompany();
$df1.resolve();
return $df1.promise();
}).fail(function (json) {
self.notifyNoInstall(json.error);
self.setInstall(false);
self.setDispatchCompany();
$df1.reject();
return $df1.promise();
});
} else {
this.setInstallDetail({
install: 0,
ref_id: 0,
retail_price: 0
});
}
this.setDispatchCompany();
$df1.resolve();
return $df1.promise();
};
答案 0 :(得分:4)
我明白了。
为了让setInstall等待inInstallableRegion完成,inIntsallableRegion必须返回一些东西。仅仅返回ajax请求是行不通的,因为它只是在完成时才返回。根据ajax请求的结果,它不会返回我是否要接受或拒绝。
所以我只是让它返回自己的延迟对象,当ajax运行时和处理结果时。我是在inInstallableRegion
中做到的var self = this;
return $.Deferred(function(dfd) {
self.sendData(params, 'installerCache', true).then(function(json) {
if(json.error) {
dfd.reject();
} else {
dfd.resolve();
}
return dfd.promise();
});
});