如何正确循环异步 knex 调用?

How to properly loop through asyncronous knex calls?

我有一个程序,它取决于从前端发送的数组的大小,然后我必须循环对数据库进行 knex 调用,然后 return 将这些值发送到前端。

我尝试了一些其他人建议使用 Promise.all() 和 map() 函数的方法,例如:

const req=Json.parse(datafromFE)

const neededvar={
   result1="",
   result2=[]
}

var call1=knex.select('field1').from('Table1').then(result=>{neededvar.result1=result});

function getData(current,i,knex){
  knex.select('data').from('table').where('data','=',current.field)
 .then((result)=>{
   neededvar.result2[i]=result*neededvar.result1 
   return(neededvar.result2)
})
}

Promise.all([call1,req.map((current,i)=>{getData(current,i,knex)}])
.then((values)=>{
console.log(values)
e.returnValue=neededvar//using electron ipcRenderer I believe is similar to 
                      //vanilla nodejs backend res.json('placedatahere')
//so just think about 
//res.json(neededvar)
})

然而,当我 运行 调用时 console.log(values) returns undefined for the array map calls 但不是第一个 knex select 调用这里:

console.log(neededvar)
//[result1,undefined,undefined...]

我试图检查它是否是我的 knex 调用,只是通过调用地图内的 call1 函数来这样做,但仍然 return 未定义。

var call1=knex.select('field1').from('Table1')

Promise.all(req.map((current,i)=>{call1}).then((result)=>{
console.log(result)
})
//output:[undefined,...,undefined]

我可以从前端调用 API 几次,但我认为这是最有效的方法。如果有任何可以提供的指导,我将不胜感激

--------编辑--------

一定要记得把所有的return加到所有函数

function getData(current,i,knex){
  knex.select('data').from('table').where('data','=',current.field)
 .then((result)=>{
   neededvar.result2[i]=result*neededvar.result1 
   return(neededvar.result2)
})
}

真的应该是

function getData(current,i,knex){
  return(knex.select('data').from('table').where('data','=',current.field)
 .then((result)=>{
   neededvar.result2[i]=result*neededvar.result1 
   return(neededvar.result2)
}))
}

另一个 knex 调用也是如此

主要问题是您传递给 .map returns undefined:

的函数
Promise.all([call1,req.map((current,i)=>{getData(current,i,knex)}])

你的意思可能是:

Promise.all([
  call1,
  ...req.map((current,i) => getData(current,i,knex)
])

这会将第一个查询与从 req 中生成的查询数组结合起来。

你还应该return来自getData的承诺:

function getData(current,i,knex){
  knex.select('data').from('table').where('data','=',current.field)

应该是:

function getData(current,i,knex){
  return knex.select('data').from('table').where('data','=',current.field)