繁体   English   中英

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

[英]Proper way to nest error messages while making asynchronous requests

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

这是一个非常简单的例子。 我可能被嵌套在几层深的几个函数中,想要在显示给用户之前多次添加到错误消息中。

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

我是在评论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调用会创建非常差的用户体验。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM