Javascript回调排序和节点

时间:2016-11-23 16:37:43

标签: javascript node.js callback

Per http://callbackhell.com/我尝试编写回调(主要是为了学习目的,然后再进行承诺)正确的方法(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);

我使用ST3为Javascript定义的构建系统来运行它,如下所示:

{
  "cmd": ["/usr/bin/nodejs", "$file"],
  "selector": "source.js"
}

现在出现问题:如果我将行fs.readFile('test_underscore1.js', readFileDone);移到回调定义之上,它就运行(控制台中没有输出,/tmp中的文件也没有被创建)。

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

2 个答案:

答案 0 :(得分:1)

似乎是一个悬挂问题,您的函数表达式已声明但直到稍后在您指定它们的行上才设置。

实际上你最终得到了:

"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调用移到它们上面时,你可以在它们被分配了函数定义之前定位它(即它们还没有准备好)

答案 1 :(得分:-2)

这不起作用,因为javascript在加载时运行。该文件未加载然后解析然后运行。它会在解析时运行。

因此,在将回调加载到内存之前,您正在运行fs.readFile。这与任何脚本语言相同。另一方面,编译语言在运行之前就已加载。

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