0

我在传递一些值时遇到了麻烦。

我有这个结构,现在非常简单,因为我试图找出问题所在。

我想要的是将 JSON 数据保存在变量中,例如exampleschapters. 文件中的信息完美加载,我可以用alert或看到它console.log

// global variables
var JSONObject = false;
var chapters = false; // or Array depends on what I'm trying
var examples = false; // or Array depends on what I'm trying
var ajax_request = false;
var url_json = "js/database.json";

// start the process, for now
load_json_data();
console.log( JSONObject ); // outputs false

function load_json_data() {

    // new request
    ajax_request = new XMLHttpRequest();

    // do the request
    ajax_request.open( "GET", url_json, true );
    ajax_request.send( null );

    // function to parse the JSON data
    ajax_request.onload = parse_json;

    // return value
    return true;
}

function parse_json() {
    if ( ajax_request.readyState === 4 && ajax_request.status === 200 ) {
        // parse the JSON file
        JSONObject = JSON.parse( ajax_request.responseText );

        // do something with the loaded data
        temp();
    }
    return true;
}

function temp() {
    console.log( JSONObject ); // outputs the JSON content if async = true
                               // with async false, it never reaches this function
// here all the information is available and chapters and sections have values
chapters = JSONObject.chapters;
examples = JSONObject.examples;
}

这个想法是,该temp函数将被称为其他函数,注册从 JSON 文件中获得的值以用于其他函数,例如construct_select(),这将在页面中创建一个select控件。它不必是一个单独的函数;它可能在同一个parse_json()函数中,但现在它在,temp()因为我正在尽可能巧妙地尝试一些事情。

所以我想从中心函数执行load_json,parse_json和任何其他我需要的函数,但要做到这一点,我需要这些函数将值传递给其他变量。

通常,我尝试使用一个函数来控制脚本的流程,做出所有决定,其余的函数只是执行它们必须做的事情,并在需要时返回一个状态(真/假)或一个值。

我希望我能正确解释自己,但如果需要更多信息,请告诉我。

更新1:onload我想这个问题与异步过程有关,但在调用解析函数之前 不应该使用它来解决吗?此外,如果我将 async 参数更改为 false,它并没有改善。

更新 2: 如果一个函数被事件侦听器调用/执行,JSONObject则该函数可用。我仍然不明白如何或为什么,但这有助于我最终想要做的事情。它仍然不允许有一个函数来控制流程并决定执行什么,但我可以尝试将其留给事件。我仍在试图弄清楚是否可以将值传递给函数可用的全局变量,而不是由侦听器触发。

4

1 回答 1

0

看一下这个:

isArray(obj){
  if(Object.prototype.toString.call(obj) === '[object Array]'){
    return true;
  }
  else{
   return false;
  }
}
function logIt(data){
  var dc = data.chapters, de = data.examples;
  if(isArray(dc)){
    console.log(dc.join());
  }
  else{
    console.log(dc);
  }
  if(isArray(de)){
    console.log(dc.join());
  }
  else{
    console.log(de);
  }
}
function getJSON(url, callback, method, data, async){
  var req, m;
  m = !method ? 'GET' : method.toUppercase();
  if(!data)data = null;
  if(!async)async = true;
  if(window.XMLHttpRequest){
    req = new XMLHttpRequest;
  }
  else{
    req = new ActiveXObject('Microsoft.XMLHTTP');
  }
  req.open(m, url, async);
  req.onreadystatechange = function(){
    if(req.readyState == 4 && req.status == 200){
      callback(eval('('+req.responseText+')'));
    }
  }
  req.send(data);
}
getJSON('js/database.json', logIt);

请注意右侧的滚动条。问题是您必须确保在您的请求发生后会发生什么onreadystatechange,因此如果您将任何内容分配给 Objectonreadystatechage并不意味着您的其他 JavaScript 将自动访问它。解决方案是在其中包含您的代码的回调。在这种情况下,此回调必须有一个参数,该参数将传递给评估值responseText,它作为字符串返回。.eval()getJSON. _ 您可能希望将信息存储在.php页面上,而不是.json. 您的 PHP 可能类似于:

<?php
  if(isset($_POST['textInput']) && trim($_POST['textInput']) !== ''){
    echo json_encode($_POST);
  }
?>
于 2013-07-17T02:25:08.793 回答