在这两个Node.js示例中,什么是更好的异步样式?

在这两个Node.js示例中,什么是更好的异步样式?,node.js,asynchronous,Node.js,Asynchronous,我正在通过nodeschool.io learnyounode进行第四项挑战,即: 编写一个程序,使用单个异步文件系统操作读取文件并将其包含的换行数打印到控制台(stdout),类似于运行cat file | wc-l 我写了一个解决方案,它与提供的解决方案不同,但两者似乎都能起作用,我很想知道哪一种方式更好,以及它们如何发挥不同的作用 以下是我的解决方案: var fs = require('fs'); var fileAsArray = []; function asyncRead(pri

我正在通过nodeschool.io learnyounode进行第四项挑战,即:

编写一个程序,使用单个异步文件系统操作读取文件并将其包含的换行数打印到控制台(stdout),类似于运行cat file | wc-l

我写了一个解决方案,它与提供的解决方案不同,但两者似乎都能起作用,我很想知道哪一种方式更好,以及它们如何发挥不同的作用

以下是我的解决方案:

var fs = require('fs');
var fileAsArray = [];

function asyncRead(print) {
  fs.readFile(process.argv[2], 'utf-8', function callback(error, contents) {
    fileAsArray = contents.split('\n');
    print();
  })
}

function printNumberOfLines() {
  console.log(fileAsArray.length - 1);
}

asyncRead(printNumberOfLines);
以下是learnyounode提供的解决方案:

var fs = require('fs')
var file = process.argv[2]

fs.readFile(file, function (err, contents) {
  // fs.readFile(file, 'utf8', callback) can also be used
  var lines = contents.toString().split('\n').length - 1
  console.log(lines)
})

我还注意到learnyounode代码缺少分号。我想他们是被强烈推荐/要求的

为什么要在第一块代码中将结果放入全局变量中?这似乎很不可取。您应该只将数据传递给回调函数,而不使用全局值。@jfriend00好极了!我使用的是一个引用,它使用了一个全局变量。这个例子明确地说明了为什么使用全局变量是危险的。一般来说,全局变量是要避免的,但在异步代码中特别要避免全局变量,因为异步结果只能在生成它们的范围内安全地使用,并且将这些结果放入全局变量会导致误用和各种与时间相关的错误。