访问加载时ajax请求返回的数据

时间:2014-11-13 17:23:49

标签: javascript ajax json

我一直在单页网站上工作,其中来自单个json文件的数据在不同的部分中进行了不同的呈现 - 没有任何内容在加载时显示,但仅在点击事件时显示。我学到了一些关于回调的问题,但是当我差不多完成它时,我意识到这个概念有多么缺陷,所以现在我回到了绘图板。

我现在的想法是将ajax调用onload,将json结果设置为可用于多个函数的变量。我认为它会是这样的:

window.onload = function() {

    var myJsonData = function() {
        var request = new XMLHttpRequest();
        request.open("GET", "/json/someJsonData.json", true);
        request.setRequestHeader("content-type", "application/json");
        request.send(null);
        request.onreadystatechange = function() {
            if (request.readyState === 4) {
                if (request.status === 200) {
                    var myJsonString = JSON.parse(request.responseText);
                    var myJsonArray = myJsonString["Projects"];
                    return myJsonArray;
                }
            }
        } // onreadystatechange
    } // var myJsonData

    myJsonData(); // *
    console.log("myJsonArray: " + myJsonArray); // undefined

或者:

window.onload = function() {
    myJsonData();
}

function myJsonData() {
    var request = new XMLHttpRequest();
    request.open("GET", "/json/someJsonData.json", true);
    request.setRequestHeader("content-type", "application/json");
    request.send(null);
    request.onreadystatechange = function() {
        if (request.readyState === 4) {
            if (request.status === 200) {
                var myJsonString = JSON.parse(request.responseText);
                var myJsonArray = myJsonString["Projects"];
                alert("you are here (myJsonArray defined)");
                alert("myJsonArray: " + myJsonArray);
                console.log("myJsonArray: " + myJsonArray);
                return myJsonArray;
            }
        }
    } // onreadystatechange
} // var myJsonData

console.log("myJsonArray: " + myJsonArray); // undefined

或者:

window.onload = myJsonData;
// etc.

当然myJsonArray是未定义的。我显然缺少一些关于如何做到这一点的基本原则(或者这完全是一个坏主意?)。有没有办法在加载时调用ajax请求时将结果作为回调传递?

有人可以告诉我如何从这里开始,也许是一个骨架的例子吗? (p.s.仍然专注于本机js,而不是jQuery)

非常感谢,

SVS

3 个答案:

答案 0 :(得分:1)

代码中存在一些问题。首先,myJsonArray是函数myJsonData()的本地。你必须全局定义它。其次,ajax请求是异步的。在使用它之前,您必须等待结果。以下是基于您的代码的工作示例:

   var myJsonArray;  //Globally defined
        window.onload = function() {

            var outputData = function() {
                console.log(myJsonArray);
            }

            var myJsonData = function() {
                var request = new XMLHttpRequest();
                request.open("GET", "someJsonData.json", true);
                request.send(null);
                request.onreadystatechange = function() {
                    if (request.readyState === 4) {
                        if (request.status === 200) {

                            myJsonArray = JSON.parse(request.responseText);
                            outputData(); //Ouput when result is received
                        }
                    }

                } // onreadystatechange


            } // var myJsonData

            myJsonData(); // *

        }

答案 1 :(得分:1)

使用Javascript承诺可以解决您的问题。 Promises are native to ES6,虽然browser support显然还不完全。Here is a jsfiddle。无论如何,您可以通过promises实现代码:

window.onload = function () {
  myJsonData().then(function (result) {
      console.log("myJsonArray: " + result);
      alert(result.one);
      // do something else here
  });
}

function myJsonData() {
  return new Promise(function (resolve, reject) {
      var request = new XMLHttpRequest();
      request.open("GET", "http://echo.jsontest.com/key/value/one/two", true);
      request.setRequestHeader("content-type", "application/json");
      request.send(null);
      request.onreadystatechange = function() {
          if (request.readyState === 4) {
              if (request.status === 200) {
                  var myJsonString = JSON.parse(request.responseText);
                  //var myJsonArray = myJsonString["Projects"];
                  resolve(myJsonString);
              }
          }
      } // onreadystatechange
  });
} // var myJsonData

{{3}}

答案 2 :(得分:0)

根据我的经验和理解。

在处理同步功能和异步功能时,始终重要的是要知道哪些功能需要异步回调功能中的数据。

如果功能完全取决于接收到的数据,则在循环中调用这些功能将是一种良好的编码习惯

if (request.readyState === 4) {
    if (request.status === 200) {
        var myJsonString = JSON.parse(request.responseText);
        // call the function which depend on the data received here.
    }
}

我不建议将异步设置为false,因为有时会导致页面冻结。