Javascript回调顺序和节点

Javascript回调顺序和节点,javascript,node.js,callback,Javascript,Node.js,Callback,我尝试用正确的方式(tm)写回访(主要是为了学习,然后再继续承诺) 好的,我有这个: "use strict"; var fs = require('fs'); var readFileDone = function(err, data) { if(err) return console.error(err); console.log('read done'); writeFile(null, data); }; var writeFile = function(

我尝试用正确的方式(tm)写回访(主要是为了学习,然后再继续承诺)

好的,我有这个:

"use strict";

var fs = require('fs');

var readFileDone = function(err, data) {
    if(err) return console.error(err);
    console.log('read done');
    writeFile(null, data);
};


var writeFile = function(err, data) {
    if(err) return console.error(err);
    var ws = fs.createWriteStream('/tmp/copy.txt')
    ws.end(data, 'utf-8', writeFileDone);
};

var writeFileDone = function(err, data) {
    console.log('writing file done');
};

fs.readFile('test_underscore1.js', readFileDone);
我使用我为Javascript定义的ST3构建系统来运行它,如下所示:

{
  "cmd": ["/usr/bin/nodejs", "$file"],
  "selector": "source.js"
}
现在的问题是:如果我移动line
fs.readFile('test_下划线1.js',readFileDone)以上的回调定义,它不会运行(控制台中没有输出,
/tmp
中的文件也不会被创建)


为什么呢?毕竟,Javascript应该在运行之前解析整个文件,包括函数定义?因此,调用
fs.readFile
的行的位置应该无关紧要?

这不起作用,因为javascript是在加载时运行的。该文件未加载、解析并运行。它在解析时运行

因此,在回调加载到内存之前,您正在运行
fs.readFile
。这与任何脚本语言都是一样的。另一方面,编译语言在运行之前会被加载


Node使用无头浏览器(Chrome)来执行脚本,因此可以将其视为在没有UI的浏览器中运行。

似乎是一个问题,您的函数表达式已声明,但直到稍后在分配它们的行中才进行设置

实际上,您最终得到了:

"use strict";

var fs = require('fs');
var readFileDone,
      writeFile,
      writeFileDone;

fs.readFile('test_underscore1.js', readFileDone)

//  now your functions are assigned and available; after the above call

 readFileDone = function(err, data) {
    if(err) return console.error(err);
    console.log('read done');
    writeFile(null, data);
};

 writeFile = function(err, data) {
    if(err) return console.error(err);
    var ws = fs.createWriteStream('/tmp/copy.txt')
    ws.end(data, 'utf-8', writeFileDone);
};

 writeFileDone = function(err, data) {
    console.log('writing file done');
};

当您将fs调用移到它们上面时,您会在它们被分配函数定义(即它们尚未准备好)之前将其定位。

我认为OP指的是。你可能想好好读一读。这正是我要说的。。。我可能没有用过这个词(不知道有),但这就是我的答案。你呢?