jquery/ajax承诺在Durandal中的传播
我在用杜兰达尔。。我有一个基本控制器来管理对服务器的调用。。。每个控制器,每个用例专用,都使用基本控制器来调用服务器。 在基本控制器中,我有以下代码:jquery/ajax承诺在Durandal中的传播,jquery,ajax,promise,durandal,Jquery,Ajax,Promise,Durandal,我在用杜兰达尔。。我有一个基本控制器来管理对服务器的调用。。。每个控制器,每个用例专用,都使用基本控制器来调用服务器。 在基本控制器中,我有以下代码: self.call = function (url, type, data, success) { return Q.when( $.ajax({ ... error: function (jqXHR, textStatus, errorThrown) {
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
});
execute方法,内部调用我在开始时编写的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 };
});
在这种情况下,然后
代码在专用控制器中执行。在这种情况下,我如何避免阻止承诺的传播
谢谢你不要这样做:
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;
}
通过这种方式,您可能会有条件地“传播”错误,尽管我不建议这样做,因为挂起的承诺(未解决或拒绝)可能是内存泄漏的潜在来源 为了继续传播错误(导致
。然后
实现处理程序不执行),您可以重新播放错误。否。。。我想停止传播什么是Q.when
和Q.fail
,您正在使用吗?是。。也许正确的问题是如何阻止Q“承诺”的传播。。。我想我没有清楚地解释我的问题。。有人还更改了我认为现在是错误的标题。。。我有一个集中点,在这里我管理对服务器的调用。。。如果我得到一个错误500,我想在这一点上管理错误,这是集中的(当我做Q.when
或Q.fail
)。。。。在所有其他情况下,我希望在myController
的fail
中传播错误。。。。更清楚地说。。。我想进入fail
或myController
的函数(原因)
,只要它不是一个错误,你知道你可以设置一个全局jQuery ajax错误处理程序吗?您可以使用本地错误处理程序,并在本地处理程序中重新显示不希望处理的任何内容。