我正在尝试使用以下代码,但我显然很难理解$ .Deferred是如何工作的。请有人帮忙。
这个想法是,调用GetParameters,处理结果,调用GetStats,处理结果。还要将busy设置为true,将false设置为after。我期待只有一个错误传播到.fail()。
self.refreshParams = $.ajax({
url: self.ToAddress() + "/GetParameters",
data: "{}",
type: "GET",
contentType: "application/javascript",
dataType: "jsonp"
});
self.refreshMachines = $.ajax({
url: self.ToAddress() + "/GetStats",
data: "{}",
type: "GET",
contentType: "application/javascript",
dataType: "jsonp"
});
self.refresh = function () {
var d = $.Deferred();
d.pipe(self.refreshParams)
.done(function (p) {
self.params(p);
});
d.pipe(self.refreshMachines)
.done(function (m) {
self.machines(m);
});
d.always(function() {
self.busy(false);
})
.fail(function (x, e) {
self.errorText(x);
});
d.resolve();
}
更新:
我已将其更改为:
self.refreshParams = function() {
return $.ajax({
url: self.ToAddress() + "/GetParameters",
data: "{}",
type: "GET",
contentType: "application/javascript",
dataType: "jsonp"
});
};
self.refreshMachines = function() {
return $.ajax({
url: self.ToAddress() + "/GetStats",
data: "{}",
type: "GET",
contentType: "application/javascript",
dataType: "jsonp"
});
};
self.refresh = function () {
$.when(self.refreshParams(), self.refreshMachines())
.done(function (p, m) {
self.params(p[0]);
self.machines(m[0]);
})
.done(function() {
self.busy(false);
})
.fail(function (x, e) {
self.errorText(x);
});
}
如果服务已经启动,这似乎有效,但是如果出现错误,那么什么都不会归结为.fail?
答案 0 :(得分:0)
编写此类代码没有独特的方法。
对于两个ajax操作,您会发现使用单独的.done()
处理程序和.fail()
处理程序更好,从而保持其成功和错误处理彼此独立。
然后,响应复合.when()
观察者所需要做的就是重置忙状态标志。通过在.always()
处理程序中执行此操作,无论两个ajax操作的结果如何,都将重置它。
我可能会这样写:
self.refresh = function () {
self.busy(true);
var paramsPromise = self.refreshParams().done(self.params).fail(function (jqXHR, textStatus, errorThrown) {
self.errorText('refreshParams() : ' + textStatus + ' : ' + errorThrown);
});
var machinesPromise = self.refreshMachines().done(self.machines).fail(function (jqXHR, textStatus, errorThrown) {
self.errorText('refreshMachines() : ' + textStatus + ' : ' + errorThrown);
});
$.when(paramsPromise, machinesPromise).always(function () {
self.busy(false);
});
};