如何正确遍历异步knex调用?

时间:2019-10-29 17:18:56

标签: node.js promise knex.js

我有一个程序,具体取决于从前端发送的数组的大小,然后我必须循环遍历对数据库的knex调用,然后将这些值返回到前端。

我尝试了其他人使用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)返回的数组映射调用未定义,但第一个knex select调用未返回,如下所示:

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

我试图检查它是否是我的knex调用,方法是仅在地图内调用call1函数,但仍返回未定义。

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

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

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

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

必须记住将所有返回值添加到所有函数中

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调用也是如此

1 个答案:

答案 0 :(得分:1)

主要问题是传递给.map的函数返回undefined

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

您可能是说:

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

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

您还应该返回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)