Difference between readFile() and readFileSync()
以下代码将index.html的内容(它仅包含文本hello world)输出到浏览器。但是,当我用
我想念什么?是否需要其他类型的缓冲区?我正在使用节点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"); |
为了更好地理解,请运行上面的代码并比较结果。.
让我们以非阻塞为例。
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.