javascript - Javascript - 如何将回调函数的结果推送到数组时等待迭代完成

实现array.push的正确方法是什么,以便在forEach迭代完成后返回"array_of_results"?


const postgres = require("./postgres");



function get_array(value) {


 var array_of_results = []


 value.forEach( item => {


 postgres.query(item["id"],function(res){ 


 console.log(res) //gives proper res after empty array


 array_of_results.push(res);


 })


 });


 console.log(array_of_results)// prints empty array


 return array_of_results;


}




const { Pool } = require("pg");


const pool = new Pool();



var query_string ="select...."



function query(id, call) {


 pool.query(query_string, [id], (err, res) => {


 if (err) {


 console.log(err.stack)


 } else {


 call(res.rows[0])


 }


 })


}



module.exports = {


 query


}



时间:

有几种方法可以做到这个,但是首先你需要了解实际发生的事情。

postgres.query(item["id"],function(res){您正在使用(1)项目ID和(2)回调函数调用postgres.query。调用在调用代码中发生,然后立即继续,现在你已经向数据库发送了很多请求,然后立即返回一个空数组,这些回调(2)尚未被调用。

在循环的每次迭代中使用async/await并不如等待每个调用按顺序返回那样高效,最有效的方法,触发请求,并等待它们全部完成,使用promise可以做到这个。

postgres.js:


function query(id) {


 return new Promise((resolve, reject) => {


 pool.query(query_string, [id], (err, res) => {


 if (err) {


 console.log(err.stack)


 reject(err)


 } else {


 resolve(res.rows[0])


 }


 })


 }


}



module.exports = {


 query


}



main :


async function get_array(value) {


 var array_of_promises = [], array_of_results = []


 value.forEach( item => {


 array_of_promises.push(postgres.query(item["id"]));


 });


 array_of_results = await Promise.all(array_of_promises);


 console.log(array_of_results)// prints populated array


 return array_of_results;


}



请注意,当调用get_array时,必须在调用之前使用await,例如var array = get_array(items)var array = await get_array(items)在函数中使用await需要将它声明为异步函数。

如果不能将它声明为异步函数,可以更改调用代码以使用Promise:


var arrayPromise = get_array(items);


arrayPromise.then((results) => {


 // do something with results


 // but remember you cannot _return_ from within a callback, as discussed above


});



...