Vấn đề đơn giản. Gọi this.setState bên trong Promise, hiển thị trước khi kết thúc đang chờ Promise.this.setState bên trong Lời hứa gây ra hành vi lạ
vấn đề của tôi là:
- Các this.setState không phải là lập tức trở
- tôi mong đợi nó được async, do đó lời hứa chưa xử lý sẽ bị đóng cửa đầu tiên.
- Nếu một thứ gì đó sẽ phá vỡ bên trong hàm hiển thị, bắt trong Lời hứa được gọi.
- Có thể vấn đề tương tự như 1) có vẻ như kết xuất vẫn nằm trong ngữ cảnh lời hứa trong đó this.setState được gọi.
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>
);
}
}
bản ghi Currrent cho thấy:
- render-dữ liệu, []
- BẮT ĐẦU makeRankRequestCall-rankrequests
- render-dữ liệu, [. ..]
- _makeRankRequestCall-promisecatch Lỗi: Không rõ tên mô-đun ...
- render-dữ liệu, [...]
- thể Unhandled Promise
Android Emulator "phản ứng": "16.0.0- alpha.12" , "phản ứng bản địa": "0.46.4",
EDIT: gói setTimeout xung quanh this.setState cũng làm việc
setTimeout(() => {
this.setState({ data: respData.data, loading: false });
}, 1000);
EDIT2: tạo ra một báo cáo lỗi trong github phản ứng bản địa song song https://github.com/facebook/react-native/issues/15214
Tôi đang gặp rắc rối xác định chính xác những gì vấn đề mà bạn đang cố gắng để giải quyết. Bạn đang cố gắng tái render chỉ một lần tại thời điểm 'console.log (" done ");' được thực hiện? Nếu vậy, một cách để đạt được nó là ghi đè 'shouldComponentUpdate()' để nó luôn trả về 'false' và' this.forceUpdate' khi bạn sẵn sàng tái kết xuất. https://facebook.github.io/react/docs/react-component.html#forceupdate – therobinkim