下面的user.subjects = subjects
中的subject
是undefined
,而不是受试者的数组。
背景:我有三个表——用户、主题,以及用户和主题之间的关系,称为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个承诺都同时运行。因此,您的结果名称将不明确,可能是初始值(空数组(