将read yaml文件分配给浏览器中的变量以在jquery

时间:2018-01-19 22:49:37

标签: javascript jquery yaml

我正在尝试解析作为文件系统中的本地文件存在的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;
        });
    };

1 个答案:

答案 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回调函数中的配置数据,
 或者让你的请求同步,
或捕捉异步响应(例如使用承诺) 或者别的什么?