Javascript 顺序异步函数

Javascript 顺序异步函数,javascript,reactjs,ecmascript-6,async-await,react-hooks,Javascript,Reactjs,Ecmascript 6,Async Await,React Hooks,正在尝试使用async Wait按顺序更新我的状态。第一个状态函数不会在下一个函数运行之前更新状态,这取决于第一个函数的状态更改 我尝试了Promissions和async await,但是第一个状态函数不会在下一个函数之前更新 let setAudio = () => { return new Promise(resolve => { if(state.currentTrackIndex === null) { setState(state=&g

正在尝试使用async Wait按顺序更新我的状态。第一个状态函数不会在下一个函数运行之前更新状态,这取决于第一个函数的状态更改

我尝试了Promissions和async await,但是第一个状态函数不会在下一个函数之前更新

let setAudio = () => {
    return new Promise(resolve => {
      if(state.currentTrackIndex === null) {
        setState(state=>({...state, audioPlayer: new Audio()}))
        setTimeout(() => {
            resolve('done');
        }, 1000);
      } else {
        setState(state=>({...state}))
        setTimeout(() => {
            resolve('done');
        }, 1000);
      }
    })
  }
  let setTrack = (index) => {
    return new Promise(resolve => {
      if (index === state.currentTrackIndex) {
        togglePlay();
        setTimeout(() => {
            resolve('done');
        }, 1000);
      } else {
        state.audioPlayer.pause()
        state.audioPlayer = new Audio(state.tracks[index].file);
        state.audioPlayer.play();
        setState(state => ({ ...state, currentTrackIndex: index, isPlaying: true }));
        setTimeout(() => {
            resolve('done');
        }, 1000);
      }
    })
  }
  async function playTrack(index){
    try {
      let result1 = await setAudio()
      let result2 = await setTrack(index)
      return result2;
    }
    catch(error){
      console.log(error)
    }
  }
setAudio:我首先检查state.audioPlayer中的音频对象。如果current state.currentTrackIndex为空(这是启动音乐播放器之前的默认值),我希望使用state.audioPlayer中的音频对象更新状态。如果当前存在一个对象,我将保留该状态。原因是:该应用程序是用GatsbyJS制作的,因此将音频对象设置为初始状态将不起作用,需要首先渲染组件

setTrack:如果单击当前曲目,它将暂停音频播放器;如果单击其他曲目,音频对象应首先暂停,然后使用新音频对象填充,然后播放新音频。除了设置新的currentTrackIndex

playTrack:这里的目标是按顺序运行代码,首先检查音频对象,然后播放正确的音频

  • 不要直接修改
    此状态。例如,您可能希望重构此行:

    state.audioPlayer = new Audio(state.tracks[index].file);
    
    尝试改用
    this.setState()

  • 您知道
    this.setState
    已完成执行的唯一时间是在您提供的第二个参数
    this.setState
    中。不要使用在1000毫秒超时后解决的承诺,而是为this.setState提供第二个参数是否有助于解决您的任何问题?或者您想尝试将一些逻辑放入
    componentDidMount()
    中,而不是按照文档中的建议