繁体   English   中英

节点js array.push'不'工作

[英]node js array.push 'not' working

我敢肯定会犯一个愚蠢的错误,但无法追踪。 有一个简单的脚本可以读取以下格式的文件:

<option value="us">United States</option>

尝试创建以下形式的新文件:

{"value":"us","name":"United States"}

问题是jsonC.push(c)无法正常工作,并且数组仍然为空。 console.log(c)确实会打印json表示形式,但是下一行jsonC.push(c)仍然对jsonC数组没有任何影响,并且它保持为空。

这是代码:

var fs = require('fs');
var readline = require('readline');

var src = 'country.txt';
var dest = 'country.json';

var re = /.+["](\w{2})["][>]([a-zA-Z ]+)[<][/].+/;
var jsonC = [];

readline.createInterface({
    input: fs.createReadStream(src), terminal: false
}).on('line', function(line) {
    var match;
    if ((match = re.exec(line)) !== null) {
      var c = {};
      c.value = match[1];
      c.name = match[2];

      console.log(c); // prints fine
      jsonC.push(c); // not adding to the array
   }
});

console.log(jsonC); // prints []
console.log(JSON.stringify(jsonC)); // prints []

这是在Win 7上运行的独立的node.js v4.2.6脚本。

原因是因为您要在回调函数中向jsonC添加值。 readline.createInterface(...).on(function() {是一个回调,并且不同步。因此,您的程序只是调度该函数,然后执行console.log(jsonC)而jsonC仍然为空因为回调尚未触发。

尝试在回调中输出值,或使用Promise知道回调何时完成。

这是一个使用Promises的工作示例:

function readFromFile() {
    var fsRead = Promise.defer();
    readline.createInterface({
        input: fs.createReadStream(src), terminal: false
    }).on('line', function(line) {
        var match;
        if ((match = re.exec(line)) !== null) {
          var c = {};
          c.value = match[1];
          c.name = match[2];
          jsonC.push(c);
          fsRead.resolve();
       }
    });
    return fsRead.promise();
}

readFromFile().then(function(result) {
    console.log(jsonC);
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM