2017-08-18 17 views
0

私はAPIコールごとに30代を作り、いくつかの状態の応答を設定する必要があるアプリに取り組んできた内部APIの呼び出し中にのみ搭載されたり、部品実装を更新することができます。私はsetIntervalの中でそれをやっています。私はアプリのすべての画面に描画されるコンポーネントを持っています。 (setIntervalと同じコンポーネント)。すべてが動作しているようですが、私は前の画面に移動するには、ボタンを押すと、バック、私は「アンマウントコンポーネントにSETSTATE」は、この警告が表示されます。コンポーネントがこの画面にも再度マウントされていることを覚えておいてください。言葉で十分に、私はここにコードを持ってみましょう。警告:のsetInterval(ネイティブに反応)

SongActivityBar.jsアプリのいずれかの画面をクリックするよう

componentDidMount(){ 
    _isMounted = true 
    this._timer = true; 
    this.startPolling(); 
} 


    componentWillUnMount() { 
    _isMounted = false; 
    this._timer && clearInterval(this._timer); 
    this._timer = false; 
    } 

    startPolling=() => { 
     if (_isMounted){ 
      this.fetchNowPlaying(); // do it once and then start it up ... 
      this._timer = setInterval(() => this.fetchNowPlaying(), 30000); 
     } 
    } 


fetchNowPlaying() { 
    fetch(url, { 
    .......... 
    .then((response) => { 
     this._timer && this.setState({loading: false, nowPlaying: response.Message}); 
    ........ 
    }); 
    } 

、コンポーネントSongActivityBar.jsは(nav.popバック任意の画面に来て、ロードされている)やAndroidの戻るボタンは私にこの警告を与えます。

PS:私は(今のライブラリを変更することはできません)画面間を移動するための

React Native version - 0.45.1 
+0

私は考えることができる唯一の理由は、あなたが戻っているとき、何らかの形でのsetTimeoutがクリアされていないということです。しかし、なぜ私はなぜか分からない。 –

答えて

5

をナビゲーターを使用していますが、コンポーネントのライフサイクルの中に生き、それを維持するために状態でタイマーを維持する必要があります:hereから

componentDidMount(){ 
 
    this.fetchNowPlaying(); 
 
    const timer = setInterval(this.fetchNowPlaying, 30000); 
 
    this.setState({ timer }); 
 
} 
 

 
componentWillUnMount() { 
 
    clearInterval(this.state.timer); 
 
}

リファレンス。