【问题标题】:Javascript print to file sequentiallyJavascript按顺序打印到文件
【发布时间】:2019-05-18 23:13:04
【问题描述】:

不知何故,我无法解决这个问题。

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

我在这里错过了什么?

【问题讨论】:

    标签: javascript node.js file promise async-await


    【解决方案1】:

    当你有await 时,你为什么还要使用then?你需要停止使用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');
        }
      }  
    }
    

    看起来它可以工作,但需要一些测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 2015-02-13
      • 2012-05-24
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      相关资源
      最近更新 更多