javascript - 如何仅在数据推送完成时执行回调?
问题描述
由于其同步性质,我的 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 循环中,但是它们在第一次迭代时执行。
任何帮助表示赞赏!
解决方案
从功能上讲,您当前的代码看起来不错,除了您不应该将该函数作为回调调用,除非它是一个异步函数。
回调通常与异步 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
推荐阅读
- keycloak - Keycloak 映射多个用户属性
- flutter - 如何在颤振中打开侧面菜单栏?
- jquery - 如果页面包含带有 Jquery 的特定文本,如何将类添加到 body 标记?
- python - BERT 微调后得到句子级别的嵌入
- elasticsearch - 如果查询后发生匹配,有没有办法获取相关文档?
- c - 如何从文件指针中获取文件名到指针。(文件**输入文件)
- magento2 - Magento 2 将自定义列添加到报价表中
- ios - 集合中集合的 Firebase 安全规则
- ios - UITableView 单元格标签在滚动时截断
- linux - 为什么从usb 3.0端口拔出usb音箱时U盘无法寻址?