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

时间:2015-10-20 17:50:19

标签: javascript jquery ajax asynchronous error-handling

当我发出同步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;
  }

这是一个非常简单的例子。我可以通过几个深层的几个函数嵌套,并希望在将它显示给用户之前多次添加到错误消息中。

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

1 个答案:

答案 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调用可能会造成非常糟糕的用户体验。