如何正确循环异步 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)
我有一个程序,它取决于从前端发送的数组的大小,然后我必须循环对数据库进行 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)