簡化的問題。在Promise中調用this.setState,在結束之前呈現pending Promise。this.setState裏面的Promise引起奇怪的行爲
我的問題是:
- 的this.setState不立刻返回
- 我希望它是異步,使懸而未決的承諾將首先關閉。
- 如果渲染函數內部有什麼東西被打破,Promise中的catch被調用。
- 也許與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>
);
}
}
Currrent日誌示出了:
- 渲染數據,[]
- START makeRankRequestCall-rankrequests
- 渲染數據,[。 ..]
- _makeRankRequestCall-promisecatch錯誤:未知的命名模塊...
- 渲染數據,[...]
- 可能未處理的承諾
Android模擬器 「反應」:「16.0.0- alpha.12" , 「反應原生」: 「0.46.4」,
編輯:約this.setState 包裝的setTimeout也適用
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