Как правильно перебирать асинхронные вызовы knex? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть программа, которая в зависимости от размера массива, который отправляется из внешнего интерфейса, затем я должен пройти через вызов 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, как здесь:

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 Ответ

1 голос
/ 30 октября 2019

Основная проблема заключается в том, что функция, которую вы передаете .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)
...