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
的行的位置无关紧要?
答案 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的浏览器中运行。