【问题标题】:How can I execute a callback only when my data push is complete?只有当我的数据推送完成时,我才能执行回调?
【发布时间】:2019-10-09 16:22:09
【问题描述】:

由于其同步特性,我的 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 循环中,但是它们在第一次迭代时执行。

感谢任何帮助!

【问题讨论】:

  • 如果你需要回调,你应该sync中写入文件吗?
  • @Nishant 你能详细说明一下吗?
  • 你在运行node吗?
  • 试试fs.writeFile(filename, data[, options], callback)
  • @Nishant ,如果文件在循环内,则可以将数据写入文件,但这不是解决方案,因为文件打开了数千次并减慢了脚本的速度。我将研究async 解决方案

标签: javascript node.js callback


【解决方案1】:

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

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

一旦您对正常的回调感到满意,您可以尝试使用promiseasync-await,如here 所述。

【讨论】:

  • 这可能是@EcSync 接受的解决方案吗?我在电子邮件中收到了这个未回答的问题,但据我所知,没有什么可以添加或改进的!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2018-12-07
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多