【问题标题】:How do you write an error message when an Ajax call is not successful in JavaScript?当 Ajax 调用在 JavaScript 中不成功时,如何编写错误消息?
【发布时间】:2017-12-11 19:12:07
【问题描述】:

如果我的 Ajax 调用不成功,我想显示一条错误消息。很简单,但我无法修改 Ajax 函数。我创建了一个 onClick 监听器,当我的 AJAX 调用成功时它会做一些事情。我只想在通话不成功的时候做点什么。

所以如果我决定添加:

 if (xhr.status !== 200) {
   //Error Message here
   }

它会放在哪里?

JSFiddle Example Here

我的html是:

<div id="test-form">
      <h2>Add a User:</h2>
      <label for="Username:">
       <input id="username" type="text" name="username" placeholder="Type username here">
     </label>

      <label for="Email:">
      <span id='result'></span>
      <input id="email" type="email" name="email" placeholder="email">
      </label>
      <button id="myButton">add user</button>
      <h2 class="clear">Users:</h2>
      <ul id="users"></ul>
    </div>

我的代码是:

 var el = document.getElementById("myButton");
    el.onclick = function() {
      addUser(username, email, onSuccess);
    }

    function onSuccess(result){
      var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

      var username = document.getElementById("username").value;
      var email = document.getElementById("email");
        var message = document.getElementById("result").classList;

      document.getElementById("users").innerHTML+= '<li>' + username +'</li>';

    if (!filter.test(email.value)) {
        document.getElementById('result').innerHTML+='Not a valid email';
        email.focus;
         return false;
     } else {


        message.add("hide");
      }

    }



    // Do not modify this function. Add user service wrapper.
    function addUser(username, email, callback) {
        var xhr = new XMLHttpRequest();
        var response;
        var success = (!!Math.round(Math.random()));

        if (!success){
            response = JSON.stringify({
                success: success,
                error: "Oups, something went wrong!"
            });
        } else {
            response = JSON.stringify({
                success: success,
                user: {
                    username: username,
                    email: email
                }
            });   
        }

        xhr.open("POST", "/echo/json/");
        xhr.onload = function () {
                if (xhr.status === 200) {
                    callback(JSON.parse(xhr.responseText));
            }
        }
        xhr.send("json=" + response);
    };

【问题讨论】:

  • 所以不允许修改“addUser”功能?在这种情况下,您会有点卡住,因为它没有费心处理错误情况。当出现错误(即非 200 响应)时,您需要修改 xhr.onload 回调以实际执行某些操作。
  • 如果这是最简单的解决方案,为什么不允许您修改此功能?如果您所做的只是添加一些额外的错误处理功能,您将不会破坏依赖它的其他代码。
  • @Mariton 您基本上无法从 addUser() 函数外部的代码中为 ajax 调用分配侦听器,因为由于变量范围,您无法访问该函数内的 XHR 对象并且不会被它暴露。有人评论了以下关于解决方案的答案之一:stackoverflow.com/questions/5202296/… 这是一个可能的解决方法,涉及弄乱 XHR 原型对象。这可能已经差不多了。
  • @SamOnela 而且,如果您阅读了这个问题,OP 会询问在哪里放置一些代码来检查状态是否为 not 200,这意味着您的建议不会是特别有用。问题是 OP 说这段代码不能放在 addUser 函数中,这是代码中 xhr 对象实际上在范围内并且可以像这样访问的唯一位置。换句话说,问不可能。
  • @Mariton:环顾四周后,似乎在其他 cmets (stackoverflow.com/questions/5202296/…) 上发布的链接可能是您最后的希望。修改 JavaScript 本身使用的 XHR 对象似乎有点冒险,但在架构上这个概念至少是合理的。由于您无法修改代码,因此您需要修改代码所使用的依赖项。

标签: javascript ajax


【解决方案1】:

不修改函数addUser(),似乎唯一可行的方法是修改XMLHttpRequest原型,正如this answer所建议的那样,为readystatechange 事件(使用addEventListener())。此外,onerror 函数可以被覆盖以检测错误何时导致XMLHttpRequest 事务失败。

请记住,这会影响页面上的 ALL XMLHttpRequest!

var lastResponseCode, oldSendFunction;
// store the native send()
oldSendFunction = XMLHttpRequest.prototype.send;
// override the native send()
XMLHttpRequest.prototype.send = function() {
    //subscribe to ready state change events
    this.addEventListener("readystatechange", function(readyEvent) {
        //store the response code, to be checked later
        lastResponseCode = readyEvent.target.status;
    });
    // call the native send()
    oldSendFunction.apply(this, arguments);
}
function onSuccess(result) {
    if (lastResponseCode == 200) {
        //last request was successful
        //...
    }
    else {
         //other response was received - could have been 2xx,3xx,4xx,5xx
    }
}

这保存在this updated plunker 中,但似乎不太可能产生除 200 以外的响应代码。要测试失败的 XHR 请求,请尝试 this PHPfiddle,其中所有其他 XHR 请求都会产生500 的响应代码.

【讨论】:

【解决方案2】:

我猜这个问题是要求您在 AJAX 请求返回错误并且不允许修改 addUser() 时显示错误消息。如果你注意看addUser()函数

addUser(用户名、邮箱、回调)

在此函数内部,代码显示它们正在模仿随机故障情况,如下所示:

    var success = (!!Math.round(Math.random()));
    if (!success){
        response = JSON.stringify({
            success: success,
            error: "Oups, something went wrong!"
        });
    } else {
        response = JSON.stringify({
            success: success,
            user: {
                username: username,
                email: email
            }
        });   
    }

所以我认为您可以检查回调函数的响应。响应将随机显示错误或成功。因此,您根本不需要修改 addUser()。

function onSuccess(result){
      //check your console to see what is the result first, so you can know how it works
      console.log(result);

      if(result.success){
       // do something
       }else{
       // display error message
   }
}

【讨论】:

    【解决方案3】:

    您可以检查 xhr 状态,如果不是 200 则表示不成功, 然后你可以抛出 responseText。

    if (xhr.status !== 200)
        throw(xhr.responseText);
    

    【讨论】:

    • 愚蠢的问题,但我应该把回复文本放在哪里?
    • @Mariton 只是把它放在 if(xhr.status === 200){...}
    • @sagar 记住我不能修改 addUser 函数
    • 不修改此函数,您需要查看所有 ajax 调用,如下面的帖子; stackoverflow.com/questions/5202296/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2019-11-12
    • 1970-01-01
    • 2017-07-26
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多