Javascript回调顺序和节点
我尝试用正确的方式(tm)写回访(主要是为了学习,然后再继续承诺) 好的,我有这个: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(
"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"
}
现在的问题是:如果我移动linefs.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指的是。你可能想好好读一读。这正是我要说的。。。我可能没有用过这个词(不知道有),但这就是我的答案。你呢?