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

React 等待一个循环(和 setState)在另一个循环之前完成

React 等待一个循环(和 setState)在另一个循环之前完成

侃侃无极 2023-02-24 11:04:59
handleSubmit = () => {    this.setState({ modalState: false })    this.state.codeToClass.forEach((code, classId, map) => {      const cr = _.find(this.state.classRoles, { id: classId })      if (code === cr.classCode) {        console.log('here')        this.setState(state => ({           classRoles: state.classRoles.map((cc) => {            console.log(cc.id)            console.log(classId)            console.log(cc.id === classId)            if (cc.id === classId) {              console.log('here1')              return {                ...cc,                role: 'TA',              }            }            console.log('what')            return cc          }),        }), ()=> console.log(this.state.classRoles)) //this is called later              } else {        NotificationManager.error('Failed to register as TA.')      }    })    console.log(this.state.classRoles) //this is called first    this.state.classRoles.forEach((c) => {      if (c.role === '') {        api.deleteClassUser(c.id, this.state.user.id)      } else {        api.postAddClass(c.id, this.state.user.id, c.role)        console.log(c)      }    })    EventEmitter.publish('currentlyEnrolled', this.state.classRoles)  }我正在尝试在第一个 forEach 完成后运行第二个 forEach,即状态已更新。但它一直按这个顺序运行。有没有办法来解决这个问题?
查看完整描述

3 回答

?
largeQ

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

this.setState 是一个异步操作。


你可以尝试这样的事情:


handleSubmit = () => {

   //some code...

   

   this.setState(state => ({

      state.codeToClass.forEach((...args) => {

         //logic to update the state...

      });

   }), setClassRoles); //call a function after the state value has updated

   

}


setClassRoles = () => {

    this.state.classRoles.forEach((...args) => {

        //your code...

    });

    EventEmitter.publish('currentlyEnrolled', this.state.classRoles)

}


查看完整回答
反对 回复 2023-02-24
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

有两种选择。

  1. 使用承诺

  2. 异步等待

由于地图可以与等待一起使用,我认为

const tempState = this.state.codeToclass;
await tempState.map(...

这种方式可以工作:)


查看完整回答
反对 回复 2023-02-24
?
互换的青春

TA贡献1797条经验 获得超6个赞

Promise是你的朋友。


// You map your operations in to Promises.

 const promises = this.state.codeToClass.map((code, classId, map) => {

   return new Promise(resolve=>{

      const cr = _.find(this.state.classRoles, { id: classId })


      if (code === cr.classCode) {

        console.log('here')

        this.setState(state => ({ 

          classRoles: state.classRoles.map((cc) => {

            console.log(cc.id)

            console.log(classId)

            console.log(cc.id === classId)

            if (cc.id === classId) {

              console.log('here1')

              return {

                ...cc,

                role: 'TA',

              }

            }

            console.log('what')

            return cc

          }),

        }), ()=> resolve()) //this is called later

        

      } else {

        NotificationManager.error('Failed to register as TA.')

      }

    })

})


// and then you wait for all of the promises


await Promise.All(promises);

// then continue to execution


查看完整回答
反对 回复 2023-02-24
  • 3 回答
  • 0 关注
  • 276 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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