首页 > 解决方案 > 如何在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++;
    }

标签: node.jsasynchronousreadfile

解决方案


您的脚本中有两个主要错误。

首先,您使用了错误的 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++
    }
}

推荐阅读