簡略化された問題。プロミス内でthis.setStateを呼び出すと、Promiseを保留中に終了する前にレンダリングされます。this.setState inside Promiseは異常な動作を引き起こします
私の問題は次のとおりである:保留中の約束が最初に閉鎖されるように
- this.setStateは、すぐに私はそれが非同期であることが予想
- を返さないです。
- レンダリング機能内で何かが壊れると、Promise内のキャッチが呼び出されます。
- おそらく、1)と同じ問題は、レンダリングがthis.setStateが呼び出された約束の文脈のままであるようです。
import dummydata_rankrequests from "../dummydata/rankrequests";
class RankRequestList extends Component {
constructor(props) {
super(props);
this.state = { loading: false, data: [], error: null };
this.makeRankRequestCall = this.makeRankRequestCall.bind(this);
this.renderItem = this.renderItem.bind(this);
}
componentDidMount() {
// WORKS AS EXPECTED
// console.log('START set');
// this.setState({ data: dummydata_rankrequests.data, loading: false });
// console.log('END set');
this.makeRankRequestCall()
.then(done => {
// NEVER HERE
console.log("done");
});
}
makeRankRequestCall() {
console.log('call makeRankRequestCall');
try {
return new Promise((resolve, reject) => {
resolve(dummydata_rankrequests);
})
.then(rankrequests => {
console.log('START makeRankRequestCall-rankrequests', rankrequests);
this.setState({ data: rankrequests.data, loading: false });
console.log('END _makeRankRequestCall-rankrequests');
return null;
})
.catch(error => {
console.log('_makeRankRequestCall-promisecatch', error);
this.setState({ error: RRError.getRRError(error), loading: false });
});
} catch (error) {
console.log('_makeRankRequestCall-catch', error);
this.setState({ error: RRError.getRRError(error), loading: false });
}
}
renderItem(data) {
const height = 200;
// Force a Unknown named module error here
return (
<View style={[styles.item, {height: height}]}>
</View>
);
}
render() {
let data = [];
if (this.state.data && this.state.data.length > 0) {
data = this.state.data.map(rr => {
return Object.assign({}, rr);
});
}
console.log('render-data', data);
return (
<View style={styles.container}>
<FlatList style={styles.listContainer1}
data={data}
renderItem={this.renderItem}
/>
</View>
);
}
}
とれログ示す:
- レンダリングデータを、[]
- START makeRankRequestCall-rankrequests
- 、[データをレンダリングします。 ..]
- _makeRankRequestCall-promisecatchエラー:不明な名前のモジュールに...
- レンダリングデータを、[...]
- 可能性のある未処理の約束
Androidのエミュレータ "反応":「16.0.0- alpha.12" 、 "反応するネイティブの": "0.46.4"、
EDIT:this.setState周り ラッピングのsetTimeoutも
0123を動作しますsetTimeout(() => {
this.setState({ data: respData.data, loading: false });
}, 1000);
EDIT2: 並列 https://github.com/facebook/react-native/issues/15214
私はあなたがしようとしている発行正確に何のトラブルの識別を持っています解決する。 'console.log(" done ");'が実行されたときに一度だけ再レンダリングしようとしていますか?もしそうなら、それを達成する一つの方法は、 'shouldComponentUpdate()'を上書きして常に 'false'を返すことです。再描画の準備ができたら' this.forceUpdate'。 https://facebook.github.io/react/docs/react-component.html#forceupdate – therobinkim