我正在尝试解析作为文件系统中的本地文件存在的yaml文件,并将其分配给可在jquery中使用的变量。 我可以从console.log中看到_yaml变量以可读格式包含读取yaml但返回它并将其分配给ymlconfig似乎不起作用(//下面的NOT WORKING部分在控制台中显示为未定义)。 / p>
$( document ).ready(function() {
var ymlconfig = read_config('config.yaml');
console.log(ymlconfig["compute"][0]); //NOT WORKING
function read_config(cfgfile) {
$.get({url: cfgfile, dataType: "text"}).done(function (data) {
var _yaml = jsyaml.load(data);
console.log(_yaml["compute"][0]) //WORKING OK
return _yaml;
});
};
答案 0 :(得分:0)
此字符串:
console.log(ymlconfig["compute"][0]); //NOT WORKING
在读取配置之前执行。因为被调用的read_config('config.yaml')
在单独的线程中异步运行。
此外,您的function read_config(cfgfile)
不会返回任何值。
为了更好地理解这种行为,请阅读并运行以下代码:
$( document ).ready(function() {
var ymlconfig;
read_config('config.yaml'); // calling function
console.log(ymlconfig["compute"][0]); // is empty
setTimeout(function() { // let's wait 2000 ms. hope it's enough to send the request and receive and read the response
console.log(ymlconfig["compute"][0]); // TADA! It's read.
}, 2000);
function read_config(cfgfile) {
$.get({url: cfgfile, dataType: "text"})
.done(function (data) {
ymlconfig = jsyaml.load(data);
});
};
});
因此,根据您的任务,您有几种选择:
使用.done
回调函数中的配置数据,
或者让你的请求同步,
或捕捉异步响应(例如使用承诺)
或者别的什么?