仅当我的数据推送完成后,如何才能执行回调?

时间:2019-05-23 06:39:44

标签: javascript node.js callback

由于Java代码的同步性,我遇到了一个很烦人的问题,总之,问题是我需要将大量数据转储到数组中。

然后将该数组直接写入JSON文件。

function main(callback)  {
  myarrary = [] 

  //run some SQL query via stored procedure

  for (result in query) {

    myarray.push({

      //my data is entered here
    })
  }

  let data = JSON.stringify({myarray: somedata}, null, 4)
  fs.writeFileSync('testingjson.json', data)
  callback();
}
main(another_function)

我的问题是数据转储和回调将立即执行,因为这样就不会将任何数据传输到文件,并且“ another_function”依赖于那里的数据,因此也不起作用。

因此,我需要转储以等待循环完成添加myarray

我也尝试将转储和回调输入到我的for循环中,但是它们在第一次迭代时执行。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

从功能上讲,您当前的代码看起来不错,除了您不应将其作为 callback 调用,除非它是 asynchronous 函数。

回调通常与异步API关联。如果您希望main(...)立即返回,以便可以继续其他操作,这将很有用。由于这是默认行为,因此该API是

fs.writeFile(filename, data[, options], callback)

因此要将您的程序转换为异步程序,您需要:

fs = require("fs");

function main(callback)  {

    // Oops. Why is query executed synchronously?

    query = sqlSync() ;

    fs.writeFile('delete.json', "Data", callback);

}

main(() => console.log("Done"))

如果您的API支持,您还可以将SQL调用转换为异步(因为它是I / O操作)。

一旦您对普通的回调感到满意,就可以尝试使用here中提到的promiseasync-await

答案 1 :(得分:0)

如果有两个返回回调的方法,则可以使用Promise.all([])。在Promise.all()中,您可以编写数据库调用或其他解决/拒绝任何问题的函数。从那里可以在res对象中获取它们。