Javascript распечатать в файл последовательно - PullRequest
0 голосов
/ 18 декабря 2018

Каким-то образом я не могу обернуть голову вокруг этой проблемы.

Функция 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 голосов
/ 18 декабря 2018

Почему вы даже используете then, когда у вас есть await?Вам нужно прекратить использовать then и использовать только async функции и await.

. Вам никогда не понадобится конструктор Promise, если вы не заключаете в оболочку что-то, что требует обратного вызова.

Ваша проблема определенно заключается в том, что samples.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');
    }
  }  
}

Похоже, что это может сработать, но требует некоторого тестирования.

...