【发布时间】:2018-11-20 16:37:05
【问题描述】:
我搜索并阅读了有关异步函数和回调的信息。但我无法解决我的问题一个星期。我想按顺序在循环内执行“fs readfile”。我尝试了以下方法,但没有成功。
// on the code below, console.log print the value in random order and 'storedata' is empity.
// my goal is to do readfile in loop orderly and store the value
router.get("/files/readfiles", function(req,res){
var storedata= [];
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata.push(data);
console.log(data);
});
console.log(storedata); // this returns empty array
});
我也尝试了另一种方式:
router.get("/files/readfiles", function(req,res){
var filenames= ["file1","file2","file3","file4"];
filenames.forEach(readfiles);
function readfiles(value) {
var dataread = fs.readFile('views/allfiles/'+ value +'.ejs','utf8')
console.log (dataread);
}
});
在上面的尝试中我得到一个错误:TypeError [ERR_INVALID_CALLBACK]:回调必须是一个函数。
我是异步方法的新手,请提供任何帮助。
【问题讨论】:
-
您必须使用同步版本或
Promise.all。无论哪种方式,您都需要了解异步 的含义,当然console.log(storedata)会记录一个空数组,因为 IO 在运行时尚未完成。如果您使用回调,您只能访问回调中的数据。 -
你想要的结果到底是什么?尽可能快地浏览它,或者一次读取一个文件。
-
@Kevin 我想在循环内执行 fs 读取文件(按顺序读取多个文件)然后存储值以使用它。正如我在问题中所写的那样,这就是我想要的。
-
@wzwd 是的,我明白这一点,但由于读取文件的异步特性,您有两种不同的方式来做。您尚未指定首选哪一个。
标签: javascript node.js asynchronous