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

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

React:如何強制一個函數在另一個函數完全完成后運行?

React:如何強制一個函數在另一個函數完全完成后運行?

catspeake 2023-03-24 16:22:38
在這個 React Pomodoro Clock 中,有一個函數countDown。其中有一個函數叫做three. 當前,this.setState({ init: 'break' }); 在 中設置時two,three立即發生。但是,three應該等到two完成。任何幫助將不勝感激。
查看完整描述

3 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

您需要使它們異步。


喜歡...


const one = async () => {

  //some code

return

}

const two = async () => {

  //some code

return

}

const three = async () => {

  //some code

return

}

然后你可以...


one().then(two).then(three)


查看完整回答
反對 回復 2023-03-24
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

解決方案:


使用數組來保存狀態和持續時間:


const states = [ { name: 'session', duration: 1500 }, { name: 'break', duration: 300 } ]

交替數組的索引以在會話和中斷之間交替。


countDown(id){

    // set the function to a variable and set state to it, so the function

    // can be paused with clearInterval()

    var intervalFunc = setInterval(() => down(this.state.timeLeftSeconds--), 1000);

    this.setState({intervalFunc: intervalFunc});


    const down = (time) =>

    {


      if(time > 0){

        // converts seconds to MM:SS at every t-minus

        this.setState({ timeLeft: secondsToMins(time)});

        console.log(time);

        console.log(this.state.timeLeft);

      }


      if (time <= 0) {

        this.setState({ timeLeft: secondsToMins(time)});

        let sound = document.getElementById(id).childNodes[0];

        sound.play();


        let stateIndex = (this.state.stateIndex + 1) % states.length;

        this.setState({ stateIndex: stateIndex});

        this.setState({ timeLeftSeconds: states[stateIndex].duration});

        this.setState({ init: states[stateIndex].name});

        console.log(this.state.init);

      }

    }

  }


查看完整回答
反對 回復 2023-03-24
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

您可以通過使函數返回 aPromise并使用async / await關鍵字等到它們完成后再開始下一個來做到這一點。


const setDelay = delay => new Promise(resolve => {

  console.log(`Process running for ${delay}`);

  setTimeout(() => {

    console.log('Process done');

    resolve();

  }, delay);

});


(async () => {

  

  await setDelay(2000);

  await setDelay(3000);

  await setDelay(1000);

  

})();


或者你可以不用async / await并鏈接承諾。


const setDelay = delay => new Promise(resolve => {

  console.log(`Process running for ${delay}`);

  setTimeout(() => {

    console.log('Process done');

    resolve();

  }, delay);

});


setDelay(3000)

  .then(() => setDelay(1000))

  .then(() => setDelay(4000));


或者只是使用良好的老式回調。但我會選擇上述之一。


查看完整回答
反對 回復 2023-03-24
  • 3 回答
  • 0 關注
  • 254 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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