используя Promise, чтобы убедиться, что файловый поток завершен - PullRequest
0 голосов
/ 02 октября 2018

Я начинаю со следующих двух переменных

var yearTotal2008 = 0; 
var year2008TallyByPatient = {};

Затем читаю каждую строку большого csv-файла, соответственно обновляя две переменные.Это займет некоторое время.

const produceChartData = () => {
  inputStream
    .pipe(CsvReadableStream())
    .on('data', function (row) {
      if ((20080101 <= row[3]) && (row[3] <= 20081231)) {
        yearTotal2008 += parseFloat(row[6])
        yearPatientTally(year2008TallyByPatient, row[0], parseFloat(row[6]))
      }
})
    .on('end', function (data) {
      console.log('end of the read')
      console.log('year total claims: ' + yearTotal2008)
      console.log('average claims by patient: ' + averageClaimByPatient(year2008TallyByPatient))
      return;
    })
  }

Я хочу убедиться, что поток завершен и все соответствующие значения были добавлены к двум переменным.

function resolveGetCall (getCall) {
  return Promise.resolve(getCall)
}

resolveGetCall(produceChartData())
  .then(result => { 
    return Promise.resolve(averageClaimByPatient(year2008TallyByPatient)) 
  })
  .then(result => console.log(result))

вывод выглядит примерно так

NaN
end of the read
year total claims: 125329820
average claims by patient: 2447.70

Я просматривал другие темы здесь, и он просто не нажимал для меня, что я делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Для выполнения обещаний вам нужен «корень асинхронности», который является обратным вызовом.Поскольку ваша функция produceChartData не принимает обратный вызов и не возвращает обещание, ее нельзя использовать.Но его довольно легко добавить:

 const produceChartData = () => new Promise(resolve => { // return a promise and produce a callback
   inputStream
    .pipe(CsvReadableStream())
    .on('data', function (row) {
      if ((20080101 <= row[3]) && (row[3] <= 20081231)) {
        yearTotal2008 += parseFloat(row[6])
        yearPatientTally(year2008TallyByPatient, row[0],  parseFloat(row[6]))
     }
  })
  .on('end', function (data) {
     console.log('end of the read')
     console.log('year total claims: ' + yearTotal2008)
     console.log('average claims by patient: ' + averageClaimByPatient(year2008TallyByPatient))
     resolve({ yearTotal2008, year2008TallyByPatient }); // call back
  })
});

, который можно использовать как:

 produceChartData().then(({ yearTotal2008 }) => {
   console.log(yearTotal2008);
 });
0 голосов
/ 02 октября 2018

Ваш produceChartData в данный момент ничего не возвращает.Вам нужно преобразовать его, чтобы получить Promise, которое разрешает on('end'.(Просто использование Promise.resolve(getCall) не приведет к автоматическому ожиданию чего-либо асинхронного)1012 *

produceChartData()
  .then(() => {
    console.log('all done');
  });

Я вижу, что вы используете

return Promise.resolve(averageClaimByPatient(year2008TallyByPatient))

Если averageClaimByPatient работает асинхронно, то вам необходимо преобразовать его, чтобы получить также Promise, как и produceChartData был изменен выше.Тогда просто return the Promise:

.then(() => {
  return averageClaimByPatient(year2008TallyByPatient);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...