Javascript 如何仅在数据推送完成时执行回调?

Javascript 如何仅在数据推送完成时执行回调?,javascript,node.js,callback,Javascript,Node.js,Callback,由于Javascript代码的同步性,我遇到了一个相当恼人的问题,简而言之,问题是我需要将大量数据转储到数组中 然后将该数组直接写入JSON文件 function main(callback) { myarrary = [] //run some SQL query via stored procedure for (result in query) { myarray.push({ //my data is entered here })

由于Javascript代码的同步性,我遇到了一个相当恼人的问题,简而言之,问题是我需要将大量数据转储到数组中

然后将该数组直接写入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)
我的问题是,数据转储和回调会立即执行,因为没有数据被传输到文件中,“另一个函数”依赖于存在的数据,因此也不起作用

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

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


感谢您的帮助

从功能上讲,您当前的代码看起来不错,只是您不应该将该函数作为回调函数调用,除非它是异步函数

回调通常与异步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操作)


一旦您对正常回调感到满意,您可以尝试使用前面提到的
promise
async wait

如果有两种方法返回回调,您可以使用promise.all([])。在Promise.all()中,您可以编写数据库调用或其他解析/拒绝任何内容的函数。从那里你可以在res对象中得到它们

如果需要回调,则不应同步写入文件?@Nishant请详细说明一下?是否正在运行
节点
?请尝试
fs.writeFile(文件名,数据[,选项],回调)
@Nishant,如果文件在循环内,则可以将数据写入文件,但是,这并不是一个解决方案,因为文件被打开了数千次,并减慢了脚本的速度。我将研究
async
解决方案这就是解决方案@EcSync是否接受它?我在我的电子邮件中得到了这个未回答的问题,但就我所能看到的而言,没有什么可以添加或改进的!