我有一个程序,具体取决于从前端发送的数组的大小,然后我必须循环遍历对数据库的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调用也是如此
答案 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)