在typescript中我有一个DataAccess类,所以所有Ajax调用都通过一个对象进行路由,以便在我的应用程序中的很多地方保存代码的重复。
在使用这种方法时,我需要使用回调来将响应返回给调用类,以便相应地处理成功和错误。
这是打字稿
ajaxCall(retVal, retError) {
$.ajax({
type: this.callType,
data: this.dataObject,
dataType: this.dataType,
url: this.url,
contentType: this.contentType,
traditional: this.traditional,
async: this._async,
error: retError,
success: retVal
});
}
这是已编译的Javascript
AjaxDataAccessLayer.prototype.ajaxCall = function (retVal, retError) {
$.ajax({
type: this.callType,
data: this.dataObject,
dataType: this.dataType,
url: this.url,
contentType: this.contentType,
traditional: this.traditional,
async: this._async,
error: retError,
success: retVal
});
};
return AjaxDataAccessLayer;
这完全可以很好地调用ASP.Net MVC控制器,但是我遇到的问题是无论成功还是错误,回调都是retError。
这是调用Typescript
var _this = this;
var dataAccess = new DataAccess.AjaxDataAccessLayer(Fe.Upsm.Enums.AjaxCallType.Post,
Fe.Upsm.Enums.AjaxDataType.json,
"../../PrintQueue/DeletePrintQueueItems",
jsonObj);
dataAccess.ajaxCall(data => {
// success
new Fe.Upsm.Head().showGlobalNotification("Selected Items Deleted");
_this.refreshPrintQueueGrid();
(window as any).parent.refreshOperatorPrintQueueCount();
}, xhr => {
// failure
alert("An Error Occurred. Failed to update Note");
});
当单步执行并查看此状态时状态正常且响应为200.
所以,问题(如上所述)总是调用xhr \ retError而不管成功与否。
问题:如何让它进入正确的回叫?
答案 0 :(得分:2)
在错误处理程序中,您没有传递所有参数,因此您只检查请求是否成功完成。但是,之后可能会出现错误,例如处理响应时。你可以处理更好的错误:
dataAccess.ajaxCall(data => {
// success
new Fe.Upsm.Head().showGlobalNotification("Selected Items Deleted");
_this.refreshPrintQueueGrid();
(window as any).parent.refreshOperatorPrintQueueCount();
}, (xhr, errorText, errorThrown => {
// failure
console.log(xhr, errorTest, errorThrown);
alert("An Error Occurred. Failed to update Note");
});
基于使用此方法的发现,错误是您的控制器返回空响应,因此当jQuery尝试解析它们时您将获得异常,因为空字符串不是有效的JSON。