javascript - Http 状态未在 try 和 catch javascript 上触发

标签 javascript html json xmlhttprequest

我有将 JSON 发布到 API 端点的功能,该功能工作正常。这是我的代码。

function sendValuesPageLoad(){
     var xhr = new XMLHttpRequest();
     xhr.onreadystatechange = function () {
        try {
          if (xhr.readyState === 4 && xhr.status === 200) {}
        } catch (ex) {
            alert('Error parsing response.');
        }
     }
     try {
        xhr.open("POST", "test.html?"+encodedString, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.send();
     } catch (ex) {
        xhr.open("POST", "error.html?"+encodedString, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.send();
     }
} 

我想要实现的是,如果 xhr.status 不等于 200,则执行进一步的操作。

但是捕获没有被触发。

有人可以帮忙解决这个问题吗?

提前致谢。

最佳答案

XMLHttpRequest 带有自己的错误处理程序 onerror。更新您的示例

function sendValuesPageLoad(){
    var xhr = new XMLHttpRequest();
    xhr.onload = function () {
       if (xhr.status === 200) {
          // successful
       } else {
          // fails
          throw new Error('Failed with status: ' + xhr.statusText);
       }
    }
    xhr.onerror = function () {
       throw new Error('There is a problem');
    }
    xhr.open("POST", "test.html?"+encodedString, true);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send();
}

您可以通过将其包装在 Promise 中并捕获任何错误来改进这一点

function sendValuesPageLoad(){
  return new Promise(function(resolve, reject) { 
    var xhr = new XMLHttpRequest();
    xhr.onload = function () {
       if (xhr.status === 200) {
          // successful
          resolve(xhr.response);
       } else {
          // fails
          reject(xhr.statusText);
       }
    }
    xhr.onerror = function () {
       reject(Error("Network Error"));
    }
    xhr.open("POST", "test.html?"+encodedString, true);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send();
  }
}

// use case
sendValuesPageLoad().then(function(response) { 
   // use your response here
}).catch(function(error) {
   // handle your error
});

关于javascript - Http 状态未在 try 和 catch javascript 上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56562734/

相关文章:

javascript - 如何立即触发一个函数?

jquery - $.ajax() 只获取正文

javascript - 在javascript onclick中为标签添加样式

javascript - 为什么 JSON 标准中的字符串中不允许使用双引号和反斜杠?

javascript - 有多少客户端使用 MQTT 订阅了某个主题

javascript - Jquery 可对动态创建的 div 进行排序

javascript - 无法使用未定义的 Firestore 时间戳 ('toDate')

javascript - 如何使用 javascript 将一个 html 页面上的 div 内容更改为另一页面上的 div 内容?

php - 在php中取消设置编码数组后没有索引的json

java - 使用 Java API 更新 ElasticSearch 索引中的嵌套字段