javascript同步异步查询

时间:2017-04-23 13:27:00

标签: javascript node.js asynchronous

我是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'线?

抱歉愚蠢的查询。

1 个答案:

答案 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操作期间不会阻止代码的执行。这允许您同时执行更多操作,而同步版本将冻结任何其他执行,直到它完全完成(或失败)。