Узел JS, ожидающий завершения функции перед выполнением второй функции - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь выполнить firstFunction(), который анализирует CSV-файл, возвращает некоторые данные и передает их secondFunction(), чтобы затем выполнить некоторые операции. Я протестировал оба независимо, и они оба работают как задумано, но я не могу заставить secondFunction() выполнить после завершения firstFunction(). Это приводит к тому, что «данные» не определены во время выполнения.

function parentFunc(){
  firstFunction(function(data){
    secondFunction(data);
  });
}


function firstFunction(){
  var inputFile = 'import.csv';
  var dataOutput = [];
  var colHead = [];
  var parser = parse({delimiter: ','}, function(err, data){
    colHead.push(data[0][0],data[0][1],data[0][2],data[0][3],data[0][4]);
    for( i = 1; i<data.length; i ++ ){
      var line = {[colHead[0]]:data[i][0],
                  [colHead[1]]:data[i][1],
                  [colHead[2]]:data[i][2],
                  [colHead[3]]:data[i][3],
                  [colHead[4]]:data[i][4]};
      dataOutput.push(line);
    }

  });
  var readStream = fs.createReadStream(inputFile).pipe(parser);
  readStream.on('end', function(){
    return dataOutput;
  })
}
async function secondFunction(data){
  for(i=0; i<data.length;i++){
    //some operations with data, using await keyword.
  }
}

parentFunc();

Я чувствую, что решение не должно быть таким жестким, и, вероятно, это связано с фундаментальным недоразумением с моей стороны.

Пожалуйста, дайте мне знать, если требуется дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Причина, по которой это происходит, заключается в том, что синтаксический анализ файла csv является асинхронным действием.

Чтобы убедиться, что ваш secondFunction будет выполнен после вашего firstFunction, вам нужно будет использовать либо обещания, либо асинхронный / ожидающий.

В основном это выглядит так:

Использование обещаний

function parentFunc() {
  firstFunction().then(secondFunction)
}

Использование async / await

async function parentFunc() {
  let data = await firstFunction()
  secondFunction(data)
}

Вот некоторые дополнительные ресурсы по обещаниям и async / await:

Надеюсь, это поможет!

0 голосов
/ 11 сентября 2018

Вы можете вернуть promise из первой функции

function sometestFunction() {
  return Math.random();
}

function secondFunction(data) {
  console.log('data received from first function ' + data)
}

function firstFunction() {
  return Promise.resolve(sometestFunction())
}

firstFunction().then(function(data) {
  secondFunction(data);
})

В вашем случае использование async await кажется неправильным. await всегда идет внутрь async. Так что используйте async с родительской функцией и await до тех пор, пока не разрешится первая функция

async function parentFunc() {
  let x = await firstFunction();
  secondFunction(x);
}



function firstFunction() {
  return new Promise(function(resolve) {
    setTimeout(() => {
      resolve([1, 2, 3, 4, 5, 6]);
    }, 3000)
  })
}

function secondFunction(data) {
  for (var i = 0; i < data.length; i++) {
    console.log(data[i])
  }
}

parentFunc();
...