【问题标题】:Asynchronously assigning a text file to a variable in Javascript将文本文件异步分配给Javascript中的变量
【发布时间】:2016-11-08 16:38:18
【问题描述】:

我正在查看Benjamin Gruenbaum's answer,他在HTML 正文中打印result。尽管他确实广泛谈论了他和其他有关其工作原理的答案,但他们并没有直接回答“如何从异步调用返回响应”这个问题?

据我了解,他(和我)希望能够返回结果并将其分配给例如函数foo 之外的变量或console.log()。 代码如下:

      foo(function (result) {
        document.body.innerHTML = result;
      });

      function foo(callback) {
        httpRequest = new XMLHttpRequest();
        httpRequest.onreadystatechange = function () {
            if (httpRequest.readyState === 4) { // request is done
                if (httpRequest.status === 200) { // successfully
                    callback(httpRequest.responseText); // we're calling our method
                }
            }
        };
        httpRequest.open('GET', "someFile.json");
        httpRequest.send();
      }

我真正想要的是读取文件“someFile.json”并将相应的字符串存储在变量jsonString 中,而不是将其分配给页面正文,这样我就可以在其他地方使用它。

【问题讨论】:

  • 你可以。只是在callback 执行并分配它之前不要“用它做点什么”。
  • “他们没有直接回答我如何从异步调用返回响应的问题?” 那么,直接的答案是:你可以't,但这并不是真的有用。相反,我们将向您展示如何构建您的代码。
  • @Igor 我的错,我尝试了一些东西后复制了错误的部分。我只想将result 分配给一个变量,但是当我这样做时,它最终是未定义的。
  • @FelixKling 那么我有没有办法将result 分配给现有变量而不是更新body 而不必求助于服务器端编程?
  • 你可以在回调中做任何你想做的事情,例如someExistingVariable = result;。但通常会有更好的解决方案,具体取决于您的具体用例。

标签: javascript file asynchronous


【解决方案1】:

如果这是你所追求的,你可以使用一个变量来做到这一点。请记住,该变量只有在 onreadystatechange 执行并赋值时才会获得值。

  var someFileContent;

  foo(function () {
    console.log(someFileContent);
  });

  function foo(callback) {
    httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function () {
        if (httpRequest.readyState === 4) { // request is done
            if (httpRequest.status === 200) { // successfully
                someFileContent = httpRequest.responseText;
                callback(); // we're calling our method
            }
        }
    };
    httpRequest.open('GET', "someFile.json");
    httpRequest.send();
  }

【讨论】:

  • 为什么要这样做而不是将值传递给回调?
  • @FelixKling 自然。这是 OP 所缺少的。我打算删除它,因为它是如此明显。
  • @Igor 我知道我可以做到,但问题仍然存在,虽然我可以对变量 someFileContent 做任何我想做的事情,但我无法将它分配到回调之外,或者分配值到回调之外的另一个变量。例如,我希望能够在这两个函数之后使用console.log(someFileContent),然后再使用它,比如计算行数之类的。但它必须在回调之外发生。
  • @MorganFR - 我展示的代码就是这样做的。您在浏览器控制台中看到您期望的内容了吗?
  • @Igor 我确实看到了我想要的,但不是我想要的。我不想在回调函数中继续我的程序的其余部分。我对打印它没有兴趣,我想稍后通过变量使用该数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2020-10-05
  • 2013-07-15
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多