node.js - 如何在nodejs中使while循环与switch case同步?
问题描述
如何在nodejs中使while循环与switch-case同步?下面是我尝试迭代 2 次 while 循环的代码。但问题是下一次迭代甚至在完成这里的所有同步函数(readdirSync、readFileSync 等)之前就被迭代了。
我想要的是每次 whileloop 迭代它应该运行所有方法,然后再次运行下一次迭代。
目前的输出是:
i = 0
i = 1
下面是我的代码:
const dir4Data = 'C:/Users/em/Desktop/Regex_test_case/data/google_forms';
const dir4Polls = 'C:/Users/em/Desktop/Regex_test_case/Poll_Report';
var dir, i=0;
var regex4Data = /^\d{1,2}([./-])\d{1,2}\1\d{4}$/;
var regex4Polls = /^[1-9]\d*$/;
while(i < 2)
{
switch (i) {
case 0:
dir = dir4Data;
break;
case 1:
dir = dir4Polls;
break;
}
console.log('i = ', i);
fs.readdirSync(dir, function(err,files){ //Get a listing of all the files in the dir
if (err) throw err;
files.forEach(function(file){
//console.log("file = "+ file);
const writePath = 'C:/Users/em/Desktop/Regex_test_case/output/'+file;
fs.readFileSync(dir+'/'+file, function(err, data) {
console.log("data = "+ data);
var csvContent = data.toString().split('\n'); // read file and convert to array by line break
csvContent.forEach((item, index) => {
var csv;
if(!regex4Data.test(item.toString().split(' ')[0]) && index != 0 && i == 0) {
csv = csvContent[index-1].replace(/(\r\n|\n|\r)/gm, ""); // remove the breaks
// console.log(index, ' Replaced', csv);
fs.appendFileSync(writePath, csvContent[index].toString()+ ' ', function (err, data) {
if (err) throw err;
//console.log('Saved!');
})
}
else if(!regex4Polls.test(item.toString().split(',')[0]) && index != 0 && i == 1) {
csv = csvContent[index-1].replace(/(\r\n|\n|\r)/gm, ""); // remove the breaks
// console.log(index, ' Replaced', csv);
fs.appendFileSync(writePath, csvContent[index].toString()+ ' ', function (err, data) {
if (err) throw err;
//console.log('Saved!');
})
}
else {
csv = item.toString();
fs.appendFileSync(writePath, "\n"+csv + " ", function (err, data) {
if (err) throw err;
//console.log('Saved!');
})
}
});
})
})
})
i++;
}
解决方案
您的脚本中有两个主要错误。
首先,您使用了错误的 FS 模块功能。
从文档https://nodejs.org/api/fs.html#fs_synchronous_example来看,所有 FS Sync 功能都是同步的。这意味着您不必向他们传递回调。
你可以写
var response = fs.readFileSync(path);
响应的价值就是你的文件。
另一件事是,如果您不迭代异步函数,则不能使用回调,但可以使用 async/await 来完成。
这是一个循环工作的例子:
async function loop() {
var i = 0
while (i < 2) {
var response = await fs.promises.readFile(path);
console.log(response)
i++
}
}
推荐阅读
- python - 名称“net_input”未定义,即使它在全局中
- javascript - How do I control the state of this child component upon a button click in its parent?
- ruby-on-rails - Showing comment form on each post, throws "undefined method `comments' for 1:Integer" error
- sql - Rails generated model with migration never uses index when doing a where
- inheritance - 类型 ::class 与 Kotlin 中的类型有什么不同
- python - 如何在 Kivy 中更改小部件颜色
- sql-server - SQL Server:将表分区为多个表
- java - 从 Java (MailMessageHelper) 发送邮件时如何在 Outlook 中隐藏发件人地址?
- python - 如何在 print 语句中使用 for 循环?
- android - 在linux或android中获取文件/照片的物理内存地址