【问题标题】:JS node, waiting for function to complete before executing second functionJS节点,等待函数完成后再执行第二个函数
【发布时间】:2019-02-16 05:32:57
【问题描述】:

我正在尝试执行 firstFunction(),它解析一个 csv 文件并返回一些数据,然后将其传递给 secondFunction() 以执行一些操作。我已经独立测试了它们并且它们都按预期工作,但是在firstFunction() 完成后我无法让secondFunction() 执行。这会导致“数据”在执行时未定义。

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();

我觉得解决方案不应该那么难,可能是由于我的根本误解。

如果需要更多信息,请告诉我。

【问题讨论】:

  • 如果您包含您编写的代码,我们可能会更容易看到问题所在。在这里,我们看不到data 是如何以及何时被填充的。
  • 无法帮助您提供所提供的信息。需要知道这些函数中有什么
  • @LucaKiebel 用请求的信息更新了我的问题,谢谢。
  • firstFunction 不 return 做任何事情。当您尝试在调用时传递回调时,该函数(还没有?)有回调参数。
  • @Bergi 它不返回dataOutput吗?你能告诉我你的第二句话是什么意思吗?

标签: javascript node.js asynchronous synchronous


【解决方案1】:

你可以从 firstFunction 返回一个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 直到解决 firstFucntion

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();

【讨论】:

  • 这对我有用!我不确定为什么在firstFunction() 中需要承诺,但似乎parentFunc() 没有遵守 async/await ?我肯定会阅读更多有关此内容的信息,但如果我不在基地或您有任何见解,请告诉我。
【解决方案2】:

它发生的原因是因为解析你的csv文件是一个异步动作。

为确保您的secondFunction 将在您的firstFunction 之后执行,您需要使用promises 或async/await。

基本上是这样的:

使用承诺

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

使用异步/等待

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

这里有一些关于 Promise 和 async/await 的额外资源:

希望对你有帮助!

【讨论】:

  • 您给我的异步等待示例也是我认为可以使用的,我之前已经尝试过。我得到的错误是:TypeError: Cannot read property 'length' of undefined 我会尝试使用 Promise 的解决方案,但是一位导师告诉我,Promise 在 node 中并不常见。
  • 我尝试了 promise 的建议并得到了同样的错误。
猜你喜欢
  • 2020-10-30
  • 2019-02-16
  • 1970-01-01
  • 2011-02-12
  • 2021-08-21
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多