Javascript 发出异步请求时嵌套错误消息的正确方法

Javascript 发出异步请求时嵌套错误消息的正确方法,javascript,jquery,ajax,asynchronous,error-handling,Javascript,Jquery,Ajax,Asynchronous,Error Handling,当我发出同步jqueryajax请求时,我需要能够延迟向用户显示错误消息,直到我可以添加一些错误函数上下文中不存在的更多信息。我正试图找到一种方法来抛出收集到的有关异常的信息,以便它可以被捕获到链的更高层,并向用户显示更有意义的信息。我发现,即使使用同步请求,当我在error函数中放入throw语句时,它也不会被包装catch块捕获 function GetFileName(entity, field, guid){ var filename; try {

当我发出同步jqueryajax请求时,我需要能够延迟向用户显示错误消息,直到我可以添加一些错误函数上下文中不存在的更多信息。我正试图找到一种方法来抛出收集到的有关异常的信息,以便它可以被捕获到链的更高层,并向用户显示更有意义的信息。我发现,即使使用同步请求,当我在error函数中放入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;
  }
这是一个非常简单的例子。我可以通过多层嵌套多个函数,并希望在向用户显示错误消息之前多次将其添加到错误消息中

更新
我已经更新了这个问题,以反映我的最终目标(嵌套错误处理),而不要求解决方案是同步的,这是不鼓励的。

我写这篇文章是为了回应Troy在评论中提出的问题,“关于如何用异步请求在嵌套调用中正确聚合好的错误消息,您有什么建议吗?”

如果您没有做过太多的事件驱动(异步)编程之前,确实需要一点时间来适应。为自己找到一个像这样的好的在线教程:。如果您刚刚开始,您可能希望避免进入异步编程的延迟或承诺模型。这些都是很好的工具,但回调是一种更容易开始的方法

将代码转换为异步的一种方法是为函数提供两个额外的“回调函数”参数:

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调用可能会产生非常糟糕的用户体验。

我写这篇文章是为了回答Troy在评论中提出的问题,“关于如何用异步请求在嵌套调用中正确聚合好的错误消息,您有什么建议吗?”

如果您没有做过太多的事件驱动(异步)编程之前,确实需要一点时间来适应。为自己找到一个像这样的好的在线教程:。如果您刚刚开始,您可能希望避免进入异步编程的延迟或承诺模型。这些都是很好的工具,但回调是一种更容易开始的方法

将代码转换为异步的一种方法是为函数提供两个额外的“回调函数”参数:

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调用可能会产生非常糟糕的用户体验。

答案很简单;您根本不应该进行同步ajax调用。关于同步请求:从Gecko 30.0开始(Firefox 30.0/Thunderbird 30.0/SeaMonkey 2.27),由于对用户体验的负面影响,主线程上的同步请求已被弃用.了解。关于如何在嵌套调用中使用异步请求正确聚合好的错误消息,您有什么建议吗?答案很简单;您根本不应该进行同步ajax调用。关于同步请求:从Gecko 30.0(Firefox 30.0/Thunderbird 30.0/SeaMonkey 2.27)开始,由于对用户体验的负面影响,已弃用主线程上的同步请求。(来自mdn).了解。关于如何在嵌套调用中正确聚合好的错误消息,而不是使用异步请求,我有一些建议吗?Lee。我了解如何在抛出错误时传递应该调用的函数。我的同步大脑很难理解如何获得嵌套错误处理之类的行为但是。如果在发出请求时我有一些数据,我想在请求出错时使用这些数据,那么保持这些数据的最佳方法是什么?例如,我想用一条漂亮的消息包装难看的textStatus,如“无法获取实体“123321”的文件名”"感谢您的帮助。Troy,您应该能够将
实体
作为参数传递给onError函数。我在您的原始代码中看到,当错误处理程序执行时,有一条注释指出实体为null。这似乎很奇怪,因为错误函数是在GetFileName的闭包上下文中声明的。请查看此jsfiddl我想知道我的意思:Lee。我知道当抛出错误时,如何传递应该调用的函数。我的同步大脑很难理解如何获得嵌套错误处理之类的行为。如果在发出请求时我有一些数据,我想在请求出错时使用,那么什么呢保持这种状态的最佳方法是什么?例如,我想用一条漂亮的消息包装难看的textStatus,如“无法获取实体“123321”的文件名”感谢您的帮助。Troy,您应该能够将
实体
作为参数传递给onError函数。我在您的原始代码中看到,当错误处理程序执行时,有一条注释指出实体为null。这似乎很奇怪,因为错误函数是在GetFileName的闭包上下文中声明的。请查看此jsfiddl我想知道我的意思: