JavaScript按顺序将内容打印到文件

3

某种程度上,我无法理解这个问题。

下面的函数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');
            });
       // });  
    });
}

这里我漏掉了什么?

1个回答

0
为什么你还在使用then,而不是使用await呢?你需要停止使用then,只使用async函数和await
除非你要包装一个需要回调的东西,否则你永远不需要 Promise 构造函数。
你的问题肯定是samples.forEach应该是:
for(featureRow of samples) { }

在异步函数中执行这个操作可以解决排序问题。因为每次迭代都会在下一次之前完成。

我不想修复你的代码,让它只使用await。但是这里还是给出了:

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');
    }
  }  
}

看起来可能可行,但需要进行一些测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接