如何从异步调用中获取数据,而不是未定义数据



下面的user.subjects = subjects中的subjectundefined,而不是受试者的数组。

背景:我有三个表——用户、主题,以及用户和主题之间的关系,称为users_subjects。

我的目标是最终的res应该包括一组主题名称。

为此,我需要三个异步调用。

  • 从users表中获取用户
  • 从表示用户和主题之间关系的表中为每个用户获取主题(users_subjects(
  • 从主题表中获取每个主题id的名称

我的挑战是输入主题id并接收名称addSubjects的上半部分是我试图解决的,尽管没有成功:

//for every user take its id
//run its id with tutors-subjects to get all subject id with that user id
//for each subject id get is subject name through with subjects service
//add subjects key
//add each subject to an array
const addSubject = (knexInstance, users, res) => {
let resultsName = []
function testIt(subjectsArray) {
// let resultsName = []
Promise.all(
subjectsArray.map((id) =>
SubjectsServes.getById(knexInstance, id)
.then(subjectNameObject => {
console.log(subjectNameObject)
resultsName.push(subjectNameObject.subject_name)
})
.catch(err => {
//console.log(err)
})
)).then(() => {
return resultsName
})
}
let results = []
Promise.all(
users.map((user) =>
TutorsSubjectsService.getAllSubjectsForATutor(knexInstance, user.user_id)
.then(subjectsIdArray => {
return testIt(subjectsIdArray)
})
.then(sub => {
user.subjects = sub
results.push(user)
})
.catch(err => {
//console.log(err)
})
)).then(() => {
return res.json(results)
})
.catch(err => {
//console.log(err)
})
}

以下代码是它的起点-它调用上面的函数:

.get((req, res, next) => {
const knexInstance = req.app.get('db');
UsersService.getAllUsers(knexInstance)
.then(Users => {
return addSubject(knexInstance, Users, res)
})
.catch(next)

我遇到的唯一问题是testIt函数在那之前一切都很好。它们只是为了上下文。

我的问题是如何从testIt中获取正确的subjectNames?

(testIt最后一个then中的返回没有帮助;整个函数testIt只是返回标题中所说的undefined(

const  testIt = (subjectsArray)=> {

return subjectsArray.map((id) => {

return SubjectsServes.getById(knexInstance, id);

}).reduce((acc,el)=>{

acc.push(el); 
return acc;

},[])

//return array of promises

}
const addSubject = (knexInstance, users, res) => {



Promise.all(
users.reduce((acc,el)=>{ 
acc.push(TutorsSubjectsService.getAllSubjectsForATutor(knexInstance, el.user_id));              return acc; 

},[])

).then((userResults) => { 
//resolve all promises userResult is an array of result from promises above
Promise.all( userResults.reduce((acc,el)=>{
//for each user create array of promises given the subject list
acc = acc.concat(testIt(el))
} ,[]).then((results)=>{

return res.status(200).send(result);
}).catch( (err)=>{

console.log(err);

return res.status(500).end();
} )
})
.catch(err => {
console.log(err);

return res.status(500).end();
})
}

当你.then((时,意味着你正在解决承诺。因此,没有任何回报。all.Promise.all().then( result=>{} )结果是promise的输出数组。你必须把所有的承诺都锁在一起。它们是异步的,2个承诺都同时运行。因此,您的结果名称将不明确,可能是初始值(空数组(

最新更新