我在传递一些值时遇到了麻烦。
我有这个结构,现在非常简单,因为我试图找出问题所在。
我想要的是将 JSON 数据保存在变量中,例如examples
和chapters
. 文件中的信息完美加载,我可以用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
则该函数可用。我仍然不明白如何或为什么,但这有助于我最终想要做的事情。它仍然不允许有一个函数来控制流程并决定执行什么,但我可以尝试将其留给事件。我仍在试图弄清楚是否可以将值传递给函数可用的全局变量,而不是由侦听器触发。