Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript按顺序打印到文件_Javascript_Node.js_File_Promise_Async Await - Fatal编程技术网

Javascript按顺序打印到文件

Javascript按顺序打印到文件,javascript,node.js,file,promise,async-await,Javascript,Node.js,File,Promise,Async Await,不知何故,我不能把我的头围绕在这个问题上 下面的函数runOneCombination针对数千个文件执行,我想提取一些信息,进行一些计算,然后将它们打印到我一直附加到的文件中 我不认为这个项目的其他代码是必要的,但如果它是,我可以分享它 下面的代码中指出了该问题。我的期望是,对于Promise.all(res.dailyData.map(async(dailyDataRow,index,arr)=>{的每次迭代,这三条语句按顺序执行,fs.writeSync(out,'\r\n');被执行。不幸

不知何故,我不能把我的头围绕在这个问题上

下面的函数
runOneCombination
针对数千个文件执行,我想提取一些信息,进行一些计算,然后将它们打印到我一直附加到的文件中

我不认为这个项目的其他代码是必要的,但如果它是,我可以分享它

下面的代码中指出了该问题。我的期望是,对于
Promise.all(res.dailyData.map(async(dailyDataRow,index,arr)=>{
的每次迭代,这三条语句按顺序执行,
fs.writeSync(out,'\r\n');
被执行。不幸的是,这不是发生的情况。输出包含
writeDaily(out,dailyDataRow)的所有输出
追加,中间没有换行符,后面是一。然后是
featureRow[0]
中包含的所有内容(以换行符分隔),然后是
featureRow[1]
featureRow[2]
(再次没有换行符)。 我的期望是:

dailyDataRow,featureRow[0],featureRow[1],featureRow[2],\r\n
以前,这是可行的,但没有附加到文件,所以我只能处理一对文件作为输入

function runOneCombination(dailyFile,simFile) {
    return new Promise(async function(resolve, reject) {
        let res = await process(dailyFile,simFile);
        var wh = true;
        if(await fs.existsSync(outFilePath))
            wh = false;
        var out = fs.openSync(outFilePath,'a');            
       // out.once('open', async function(fd) {
            //Write Headers   
            if(wh) {
                await writeHeaders(out);
            }
            await Promise.all(res.dailyData.map( async (dailyDataRow,index,arr) => {
                if(index > 1) { 
                    let samples = await getFeatures(dailyDataRow,res.cdData);
                    await samples.forEach(async (featureRow)=>{
                        //console.log(dailyDataRow,featureRow[0],featureRow[1],featureRow[2]);
                        if(!featureRow) 
                            console.log("fail:",featureRow);
                        else { 
//Problem is in the following lines:
                            writeDaily(out,dailyDataRow).then(async(val)=>{
                                writeFeatures(out,featureRow[0]).then(async(val)=>{
                                    writeFeatures(out,featureRow[1]).then(async(val)=>{
                                        writeFeatures(out,featureRow[2]);
                                    });
                                });
                            });
                        }
                    });
                    fs.writeSync(out,'\r\n');
                }

            })).then((val)=>{
                //out.end(); //close the writing stream 
                resolve('success');
            });
       // });  
    });
}

我在这里遗漏了什么?

当您有
等待
时,为什么还要使用
然后
呢?您需要停止使用
然后
并且只使用
异步
函数和
等待

您永远不需要Promise构造函数,除非您正在包装接受回调的内容

您的问题肯定是
示例。forEach
应该是:

for(featureRow of samples) { }
在异步函数中这样做可以解决排序问题,因为每次迭代都会在下一次迭代之前完成

我不想将您的代码修改为仅在等待时使用。但无论如何,它是这样的:

async function runOneCombination(dailyFile, simFile) {
  let res = await process(dailyFile, simFile);

  let wh = await fs.exists(outFilePath)
  let out = await fs.open(outFilePath, 'a');

  //Write Headers
  if (wh) {
    await writeHeaders(out);
  }

  for (dailyDataRow of res.dailyData.slice(1)) {
    let samples = await getFeatures(dailyDataRow, res.cdData);
    for (featureRow of samples) {
      if (!featureRow) {
        console.log("fail:", featureRow);
        continue;
      }
      //Problem is in the following lines:
      await writeDaily(out, dailyDataRow);
      for (let i = 0; i < 3; i++) {
        await writeFeatures(out, featureRow[i])
      }
      await fs.write(out, '\r\n');
    }
  }  
}
异步函数runOneCombination(dailyFile、simFile){ let res=等待进程(dailyFile,simFile); 让wh=等待fs.存在(outFilePath) 放出=等待fs.打开(出口路径“a”); //写标题 if(wh){ 等待书面负责人(外出); } for(res.dailyData.slice的dailyDataRow(1)){ let samples=wait getFeatures(dailyDataRow,res.cdData); 用于(特征样本行){ 如果(!featureRow){ console.log(“失败:”,featureRow); 继续; } //问题在于以下几行: 等待写入(输出,每日数据行); for(设i=0;i<3;i++){ 等待写入功能(输出,功能行[i]) } 等待fs.写入(输出“\r\n”); } } }
看起来它可以工作,但需要一些测试