当我发出同步jQuery ajax请求时,我需要能够延迟向用户显示错误消息,直到我可以添加一些在我的错误函数的上下文中不存在的更多信息。我试图找到一种方法来抛出收集的有关异常的信息,以便它可以被捕获到链的更高位置,并向用户显示更有意义的信息。我发现即使使用同步请求,当我在我的错误函数中放入一个throw语句时,我的包装catch块也没有捕获它。
function GetFileName(entity, field, guid){
var filename;
try
{
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
datatype: "json",
url: myURLwashere,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("Accept", "application/json");
},
async: false,
success: function (data, textStatus, xhr) {
var result = data.d;
filename = result[field];
},
error: function (xhr, textStatus, errorThrown) {
throw textStatus + " " + errorThrown;
//entity, field and guid are null here
}
});
}
catch (err){
//this catch block does not catch the exception thrown by the error function.
throw "Error Getting File Name from web service for entity '" + entity + "' field '" + field + "' and guid '" + guid + "' (" + err.message + ")";
}
return filename;
}
这是一个非常简单的例子。我可以通过几个深层的几个函数嵌套,并希望在将它显示给用户之前多次添加到错误消息中。
更新 我已经更新了问题以反映我的最终目标(嵌套错误处理),而不要求解决方案是同步的,这是不鼓励的。
答案 0 :(得分:0)
我写这篇文章是为了回应Troy在评论中提出的问题,“如何在嵌套调用中正确汇总好的错误消息,而不是使用异步请求?”
如果你之前没有做过很多事件驱动(异步)编程,那么它需要花一些时间来习惯。找到一个像这样的好的在线教程:http://code.tutsplus.com/tutorials/event-based-programming-what-async-has-over-sync--net-30027。如果您刚刚开始,您可能希望避免进入异步编程的Deferred或Promise模型。这些都是很棒的工具,但回调是一种更简单的方法。
将代码转换为异步的一种方法是为函数提供两个额外的“回调函数”参数:
function GetFileName(entity, field, guid, onSuccess, onError){
现在将async
更改为true并修改成功和错误函数,如下所示:
async: true,
success: function (data, textStatus, xhr) {
var result = data.d;
filename = result[field];
onSuccess( filename );
},
error: function (xhr, textStatus, errorThrown) {
// REMOVE: throw textStatus + " " + errorThrown;
//entity, field and guid are null here
onError(textStatus, errorThrown);
}
然后删除catch
块和return
语句。
此样式将导致您返工或甚至重新设计一些当前的代码库。但正如其他人所指出的那样,使用同步ajax调用可能会造成非常糟糕的用户体验。