如何在节点js中使while循环与switch case同步?

How to make while loop with switch case synchrounous in nodejs?

如何在 nodejs 中使 while 循环与 switch-case 同步?下面是我尝试迭代 while 循环的 2 次迭代的代码。但问题是下一次迭代甚至在完成这里所有的同步函数(如 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}\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);

而response的值就是你的文件。

另一件事是,如果你不想迭代一个异步函数,你不能使用回调,但你可以使用 async/await。

这是一个循环工作的例子:

async function loop() {
    var i = 0
    while (i < 2) {
        var response = await fs.promises.readFile(path);
        console.log(response)
        i++
    }
}