我是Javascript的新手。
在nodejs代码下同步运行,我不明白,为什么?
var http = require("http");
var fs = require("fs");
http.createServer(function (request, response) {
// Send the HTTP header
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World"
response.end('Hello World\n');
}).listen(8081);
// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");
我的输出为:
Server running at http://127.0.0.1:8081/
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Program Ended
在nodejs代码下异步运行,我不明白,为什么?我同意readFile函数中有一个回调函数,为什么它的行为异步?
var http = require("http");
var fs = require("fs");
http.createServer(function (request, response) {
// Send the HTTP header
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World"
response.end('Hello World\n');
}).listen(8081);
// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');
fs.readFile('input.txt', function(err, data){
console.log(data.toString());
});
console.log("Program Ended");
这是输出:
Server running at http://127.0.0.1:8081/
Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
你能不能有人解释清楚为什么上面的表现如此。回调总是异步的吗?我也想知道内部如何执行回调函数。
假设控件来到行readFile
函数(其中有回调函数),为什么控件会立即执行另一个语句?如果控制转换到另一个语句,谁将执行回调函数?在回调返回一些值之后,再次控制回到同一语句即,' readFile'线?
抱歉愚蠢的查询。
答案 0 :(得分:0)
同步版本( fs.readFileSync )将阻止执行,直到读取文件并返回包含文件内容的结果:
var data = fs.readFileSync('input.txt');
这意味着在完全读取文件并将结果返回给数据变量之前,不会执行下一行代码。
另一个( fs.readFile )手上的异步版本会立即将执行返回到下一行代码(console.log("Program Ended");
):
fs.readFile('input.txt', function(err, data) {
// This callback will be executed at a later stage, when
// the file content is retrieved from disk into the "data" variable
console.log(data.toString());
});
然后,当完全读取文件内容时,将调用传递的回调,因此您将看到稍后打印的文件的内容。建议使用第二种方法,因为在文件I / O操作期间不会阻止代码的执行。这允许您同时执行更多操作,而同步版本将冻结任何其他执行,直到它完全完成(或失败)。