亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 262 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號