2016-06-15 24 views
0

私はアプリケーションのNavigatorコンポーネントを使用して、サーバーからデータを取得するためにfetchを使用してルートのコンテンツをレンダリングします。私が持っている非同期機能のsetStateはネイティブに反応します

componentDidMount() { 
    fetch(url).then((res) => { 
     this.setState({data: res}); 
    }); 
} 

問題は私がアンマウントコンポーネントを更新しようとしているエラーを得続けるようにと呼ばれる部品がもはやマウントされたときに、時には閉鎖火災をフェッチしないということです。これは、ルート間をすばやく移動する場合に発生します。コンポーネントが取り外された場合にクロージャの実行を終了する方法はありますか?

答えて

2

コンポーネントの取り付け時にはfetchリクエストを開始し、Promiseとして保存してください。

この場合、PromiseCancelablePromiseとなり、コンポーネントをアンマウントすると約束が取り消されます。

HereCancelablePromiseの作成方法を読むことができます。

+0

ありがとうございました。 実際に私の閉鎖で持っていたのは、受け取ったデータの種類よりもフェッチしていました。これは私に3つの約束を破るアイデアを与えるので、コンポーネントがすでに第2部分で取り外されていればソートをスキップすることもできます。 –

0

状態を設定する前に、コンポーネントがマウントされているかどうかを確認する必要があります。

componentDidMount() { 
    this.isMounted = true; 
    fetch(url).then((res) => { 
     if(this.isMounted) { 
      this.setState({this.data: res}); 
     } 
    }); 
} 

componentWillUnmount() { 
    this.isMounted = false; 
} 
+0

私の答えにリンクされた記事を読んでください。 'isMounted'はアンチパターンです。 – neciu

+0

うわー、前にそれを見たことはありません。リンクありがとう。 –

関連する問題