javascript - Async/Await 无法获取 JSON 数据

标签 javascript promise async-await

我正在 Windows 上的 vagarnt 上运行 ubuntu 服务器。我在文件夹的文档根目录中有一个 JSON 文件。我想使用 async/await 来获取 JSON 数据。这是我在谷歌搜索和学习后想出的代码。

    async function getJSON() {
    try {
      var result = await makeRequest("GET", "./form-data/test-items/test.json");
      console.log(result);
    } catch(error) {
      console.log(error);
    }
  }

  function makeRequest(method, url) {
    return new Promise(function(resolve, reject) {
      let xhr = new XMLHttpRequest();
      xhr.overrideMimeType("application/json");
      xhr.addEventListener("readystatechange", function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
          var respond = xhr.responseText;
          resolve(respond);
        } else {
          reject(xhr.statusText);
        }
      }, false);
      xhr.open(method, url, true);
      xhr.send();
    });
  }

  document.addEventListener("DOMContentLoaded", getJSON, false);

问题在于,只有 async 函数中的 catch block 一直在运行。我确信我从 Ajax 请求中获得了响应文本,因为我已经在控制台上对其进行了测试。但我不知道await语句是如何失败的。

我该如何解决这个问题?我错过了哪一部分?

最佳答案

问题是一个简单的逻辑错误。这里:

if (xhr.readyState === 4 && xhr.status === 200) {
  var respond = xhr.responseText;
  resolve(respond);
} else {
  reject(xhr.statusText);
}

如果readystate不是4并且status不是200,你就拒绝了这个promise。但是现在下结论还为时过早。如果您检查:

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState

您会注意到readyState可以有5个不同的值。没有一个表明错误。

结论,尝试这样的事情:

if (xhr.readyState === 4) {
  if (xhr.status === 200) {
    resolve(xhr.responseText);
  }
  else {
    reject(xhr.statusText);
  }
}

关于javascript - Async/Await 无法获取 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54569924/

相关文章:

javascript - 在 Chrome Puppeteer 中获取 XPath 列表的正确方法

javascript - 如何使用 async/await 返回 Ajax 结果?

javascript - 在 Lambda 的 node8.10 中获取 API 调用导致 Promise <pending> 和 undefined

c# - foreach 中的异步方法并将结果添加到列表中

javascript - 参数是否传递给函数参数?

javascript - 我无法在我的 js 文件中放置两个或更多 svg 形状并让它们显示在我的网站上

javascript - 按比例缩小的 div 会占据整个空间,您可以滚动浏览空白空间

mysql - 如何在node.js中使用promise从mysql查询中获取结果

javascript - 在 API 中使用 JavaScript Promise

javascript - 调试帕斯卡三 Angular 形