关于javascript:readFile()和readFileSync()之间的区别

Difference between readFile() and readFileSync()

以下代码将index.html的内容(它仅包含文本hello world)输出到浏览器。但是,当我用readFileSync()替换readFile()时,请求超时。

我想念什么?是否需要其他类型的缓冲区?我正在使用节点0.61并表示2.4。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var express = require('express');
var fs = require('fs');

var app = express.createServer(express.logger());

app.get('/', function(request, response) {
    fs.readFile('index.html', function(err, data){
        response.send(data.toString());
    });
});

var port = process.env.PORT || 5000;
app.listen(port, function() {
  console.log("Listening on" + port);
});


如上所示,

fs.readFile进行了回叫,它调用response.send-很好。如果仅将其替换为fs.readFileSync,则需要知道它不会进行回调,因此调用response.send的回调将永远不会被调用,因此响应将永远不会结束并且会超时。

如果您不只是将readFile替换为readFileSync,则需要显示readFileSync代码。

此外,您已经知道,切勿在节点express / webserver中调用readFileSync,因为它会在执行I / O时阻塞单线程循环。您希望节点循环处理其他请求,直到I / O完成并且您的回调处理代码可以运行为止。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'use strict'
var fs = require("fs");

/***
 * implementation of readFileSync
 */

var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");

/***
 * implementation of readFile
 */

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

为了更好地理解,请运行上面的代码并比较结果。.


readFileSync()是同步的,并阻止执行直到完成。这些将其结果作为返回值返回。
readFile()是异步的,在后台运行时会立即返回。您传递一个回调函数,当它们完成时将被调用。
让我们以非阻塞为例。

following method read a file as a non-blocking way

1
2
3
4
5
var fs = require('fs');
fs.readFile(filename,"utf8", function(err, data) {
        if (err) throw err;
        console.log(data);
});

following is read a file as blocking or synchronous way.

1
var data = fs.readFileSync(filename);

LOL...If you don't want readFileSync() as blocking way then take
reference from the following code. (Native)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var fs = require('fs');
function readFileAsSync(){
    new Promise((resolve, reject)=>{
        fs.readFile(filename,"utf8", function(err, data) {
                if (err) throw err;
                resolve(data);
        });
    });
}

async function callRead(){
    let data = await readFileAsSync();
    console.log(data);
}

callRead();

it's mean behind scenes readFileSync() work same as above(promise) base.