我怎样才能从异步调用中获取数据而不是未定义?

subjectin user.subjects = subjectsbelowundefined不是一组主题。

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

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

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

  • 从用户表中获取用户

  • 从表示用户和主题之间关系的表(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)

        })


}


我遇到的唯一问题是 testIt 函数。到那时为止一切正常。他们只是在这里查看上下文。


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


(testItlast中的 returnthen没有帮助;整个函数 testIt 只是undefined如标题中所述返回)


慕哥6287543
浏览 94回答 1
1回答

汪汪一只猫

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() 这意味着你正在解决承诺。所以没有返回到 promise.all。 Promise.all().then( result=>{} ) result 是 promises 的输出数组。你必须将所有的承诺链接在一起。它们是异步的,2 个承诺都同时运行。所以你的结果名称将是不明确的,可能是初始值(空数组)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript