由于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循环中,但是它们在第一次迭代时执行。
感谢您的帮助!
答案 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中提到的promise
或async-await
。
答案 1 :(得分:0)
如果有两个返回回调的方法,则可以使用Promise.all([])。在Promise.all()中,您可以编写数据库调用或其他解决/拒绝任何问题的函数。从那里可以在res对象中获取它们。