【问题标题】:Script doen't execute a code line - why?脚本不执行代码行 - 为什么?
【发布时间】:2012-03-27 17:49:14
【问题描述】:

我想编写一个简单的 NodeJS 应用程序,它读取一个文件,逐行分析它的行并写入结果。这是有效的代码示例

var lines;
var fs = require('fs');
var data="";
fs.readFile('list.csv', 'ascii', function(err,data){
    if(err) {
        console.error("Could not open file: %s", err);
        process.exit(1);
    }
    var data2=data.split(/[\n\r]+/);
    for(var i=0; i<data2.length; i++){
        /*LISTING ALL THE LIST LINE-BY-LINE */
        console.log(i + data2[i]);
    }
});

我想知道为什么要在function(err,data){..*my-code*..} 中编写代码?我试图将所有变量声明为全局并编写

console.log();

在代码的末尾 - 似乎它只是不执行此代码行。那么,为什么我不能在function(err,data){}之外写代码呢?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

NodeJS 的主要特性之一是非阻塞事件循环。当函数需要很长时间时,Node 脚本不会等待函数返回,这就是您需要在回调中传入代码的原因。

【讨论】:

  • 那么,如果我想写一个非阻塞脚本,我应该在回调函数中编写我的代码来处理回调?
  • 是的,就像您发布的演示一样。如果不这样做,则无法保证您的代码将在 readFile 函数之前还是之后运行 - 因此您可能会也可能不会获得数据。
【解决方案2】:

如果您需要“阻塞行为”,您可以使用同步 fs 方法。

请参阅文档:

http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

【讨论】:

  • 哇,谢谢!我真的没有意识到异地有这么好的文档和 NodeJS)
【解决方案3】:

默认情况下,所有文件系统操作都是非阻塞的,因此需要在操作完成时运行的回调函数中使用结果,在这种情况下,当文件已完成读入变量时。

虽然使用非阻塞 IO 允许服务器同时运行多个操作通常是更好的设计,但您可以将大部分 fs 操作切换为同步运行:

var data = fs.readFileSync('list.csv', 'ascii');

【讨论】:

  • 效果很好,谢谢。虽然,我注意到这段代码的运行速度比我之前列出的异步代码要慢一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多