【发布时间】:2012-03-06 06:08:14
【问题描述】:
已解决
我在 jQuery 1.7.1 中遇到了 $.Deferred 的问题。我认为 when/then/fail 等返回值的行为与我认为的不同。
这就是我想要做的:
- 调用
$.when(setInstall(true)).then('do something');(这有效,它等待ajax请求) - --> 调用 this.inInstallableRegion() 来运行 ajax 请求。
- ---> AJAX请求成功后,我想根据AJAX请求的结果来解析或拒绝
inInstallableRegion的$df。 - ---->
this.inInstallableRegion检测到有错误,因此它拒绝了$df的承诺(这有效),我希望它返回给setInstall。 我假设this.inInstallableRegion的$.done()的返回值作为this.inInstallableRegion的结果返回(即在这种情况下被拒绝)。
由于某种原因它拒绝$df,但是当我转到setInstall 时,它运行$.done 函数,而不是$.fail 一个:.. 我错过了什么吗?
对不起,真的不能为此做一个 jsfiddle :\ 想不出一种更简化它的方法......我的大脑完全炸了 :|
这是两个函数:
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();
};
/////////////////////////////////
this.inInstallableRegion = function () {
$df = new $.Deferred();
var params = {
dataType: 'json',
data: $.param({
'zip': this.order.delivery.zip
}),
action: 'getinstaller',
cache: true
};
return $.when(this.sendData(params, 'installerCache', true)).done(function (json) {
if (json.error) {
$df.reject();
return $df.promise();
} else {
$df.resolve();
return $df.promise();
}
});
};
【问题讨论】: