Javascript 如何仅在数据推送完成时执行回调?
由于Javascript代码的同步性,我遇到了一个相当恼人的问题,简而言之,问题是我需要将大量数据转储到数组中 然后将该数组直接写入JSON文件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 })
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是否接受它?我在我的电子邮件中得到了这个未回答的问题,但就我所能看到的而言,没有什么可以添加或改进的!