为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2022-12-22 13:46:11
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 arrayconst 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如标题中所述返回)
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

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 个承诺都同时运行。所以你的结果名称将是不明确的,可能是初始值(空数组)



查看完整回答
反对 回复 2022-12-22
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号