我正在使用durandal ..我有一个基本控制器来管理对服务器的调用...每个控制器,每个用例专用,使用基本控制器来执行对服务器的调用。 在基本控制器中,我有这个代码:
self.call = function (url, type, data, success) {
return Q.when(
$.ajax({
...
error: function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 500) {
// Do some work
}
}
})
);
然后,在我的专业控制器中我有
myController.execute(command)
.then(function () {
//Do work ok
})
.fail(function (data) {
//Manage error
});
执行方法,在内部调用我在开始时编写的call
方法...
这个解决方案的问题是当我在基本控制器中管理错误时,我也执行专用控制器中的fail
代码...
我尝试的另一种方式......在基本控制器中
self.call = function (url, type, data, success) {
return Q.fail(function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 500) {
app.showError("a new error");
}
else
throw { "jqXHR": jqXHR, "textStatus": textStatus, "errorThrown": errorThrown };
});
在这种情况下,then
代码在专用控制器中执行。在这种情况下,如何避免停止传播承诺?
谢谢
答案 0 :(得分:0)
而不是这样做:
myController.execute(command)
.then(function () {
//Do work ok
})
.fail(function (data) {
//Manage error
});
你应该这样做:
myController.execute(command)
.then(function (data) {
//Do work ok
}, function (reason) {
//error handled
//you need to manully throw error here if you want the error to be propagated
//throw reason;
});
<强>更新强> 你不必用q包装jquery的承诺,这是另一种方法:
self.call = function (url, type, data, success) {
var result = Q.defer();
$.ajax({
success: function (data) {
result.resolve(data);
},
error: function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 500) {
console.log('error 500, handled');
} else {
result.reject(textStatus);
}
}
});
return result;
}
这样你就可以传播&#34;你有条件地错误,虽然我不推荐这个,因为未决的承诺(既没有解决或拒绝)可能是内存泄漏的潜在来源。