无法从React.useEffect中的React.useContext获取正确的值

问题描述

我对React还是很陌生,但是已经有几个星期了。

我正在构建音乐播放列表应用。 单击轨道时,它首先检查(API)是否具有可用的音频源。 如果是,则播放曲目。如果没有,则转到下一个

有时候,是在发出API请求时,用户单击了另一条轨道。

因此,在跟踪组件中,我想将跟踪索引与上下文跟踪索引进行比较,以检查是否仍然需要播放请求的第一条跟踪,只要它具有API响应即可。

问题是,当我在useEffect函数中比较两个值时,它为上下文跟踪索引获取错误的值(旧状态?)。

我的代码很复杂,因此我在这里做了一个简单的例子。

在我的减速器中:

  case 'SET_TRACK_INDEX':
  console.log("(Context) SET TRACK INDEX TO: " + action.payload)
  return {
    ...state,trackIndex:action.payload
  }
  break;

在我的跟踪组件中:

const [playlistData,setPlaylistData] = useContext(PlaylistContext);

//function called when I click the track
const onToggleTrack = () => {
  //set index to "1" in the context
  setPlaylistData({
    type: "SET_TRACK_INDEX",payload:1
  });

  //after one second,change index to "2" to simulate user action
  setTimeout(
    function(){
      console.log("(onToggle) waited two seconds and change index...");
      setPlaylistData({
        type: "SET_TRACK_INDEX",payload:2
      });
    },1000
  );
}

//runs when context index is updated to "1"
React.useEffect(() => {

  // (run this test for the track "1" only)
  if (playlistData.trackIndex !== 1) return;

  console.log("(useEffect) TRACK INDEX IS Now: "+ playlistData.trackIndex);

  const index = playlistData.trackIndex;

  const testIndexes = () => {

    setTimeout( //simulate an API request delay
      function(){
        console.log("(useEffect) Now context index should have been updated to '2',check values...");
        console.log("(useEffect) THIS INDEX: " + index + " VS CONTEXT INDEX: " + playlistData.trackIndex);
      },4000
    );

  }

  testIndexes();


},[playlistData.trackIndex]);

这就是我在控制台中看到的内容

(Context) SET TRACK INDEX TO: 1
(useEffect) TRACK INDEX IS Now: 1
(onToggle) waited two seconds and change index...
(Context) SET TRACK INDEX TO: 2
(useEffect) Now context index should have been updated to '2',check values...
(useEffect) THIS INDEX: 1 VS CONTEXT INDEX: 1

所以,正如您所看到的,我应该/想要得到

(useEffect) THIS INDEX: 1 VS CONTEXT INDEX: 2

但是我明白了

(useEffect) THIS INDEX: 1 VS CONTEXT INDEX: 1

触发useEffect时上下文值是否为“冻结”?
我该如何解决

谢谢!

顺便说一下,这是我的真实代码

React.useEffect(() => {
  if (track !== playlistData.trackRequested) return;

  setApiLoading(true);
  track.prepareSources()
  .then(function(){
    console.log("SOURCES READY FOR TRACK " + track.jspf.title + " by " + track.jspf.creator);

    track.getNextPlayableSource()
    .then(function(nextSource){

      console.log("REQUESTED: " + playlistData.trackRequested.jspf.title + " by " + playlistData.trackRequested.jspf.creator);
      console.log("CURRENT: " + track.jspf.title + " by " + track.jspf.creator);

      if (playlistData.trackRequested === track){ //double check this is still the requested track
        setPlaylistData({
          type: "REQUEST_SOURCE",payload:nextSource
        });
      }

    })
    .catch(function(err){
      console.log("BWERK")
    })

  })
  .catch(function(err){
    setPlaylistData({
      type: "TRACK_ERROR"
    });
    console.log("SKEEEEP TRACK");
    skipToNextTrack();
  })
  .finally(function(){
    setApiLoading(false);
  })

},[playlistData.trackRequested]);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)