首页 > 解决方案 > 如何仅在数据推送完成时执行回调?

问题描述

由于其同步性质,我的 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)

我的问题是数据转储和回调会立即执行,因此没有数据传输到文件中,并且“another_function”依赖于存在的数据,因此这也不起作用。

因此我需要转储等待循环完成附加myarray

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

任何帮助表示赞赏!

标签: javascriptnode.jscallback

解决方案


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

回调通常与异步 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-await


推荐阅读