Đây là tình huống của tôi:
- trên this.handleFormSubmit () Tôi đang thực thi this.setState ()
- bên trong this.handleFormSubmit (), tôi đang gọi this.findRoutes (); - điều này phụ thuộc vào việc hoàn thành thành công this.setState ()
- this.setState (); không hoàn thành trước this.findRoutes được gọi là ...
- Làm cách nào để đợi this.setState () bên trong this.handleFormSubmit () kết thúc trước khi gọi this.findRoutes ()?
Một giải pháp phụ:
- đặt this.findRoutes () trong componentDidUpdate ()
- điều này không thể chấp nhận được vì sẽ có nhiều thay đổi trạng thái không liên quan đến hàm findRoutes (). Tôi không muốn kích hoạt hàm findRoutes () khi trạng thái không liên quan được cập nhật.
Vui lòng xem đoạn mã bên dưới:
handleFormSubmit: function(input){
// Form Input
this.setState({
originId: input.originId,
destinationId: input.destinationId,
radius: input.radius,
search: input.search
})
this.findRoutes();
},
handleMapRender: function(map){
// Intialized Google Map
directionsDisplay = new google.maps.DirectionsRenderer();
directionsService = new google.maps.DirectionsService();
this.setState({map: map});
placesService = new google.maps.places.PlacesService(map);
directionsDisplay.setMap(map);
},
findRoutes: function(){
var me = this;
if (!this.state.originId || !this.state.destinationId) {
alert("findRoutes!");
return;
}
var p1 = new Promise(function(resolve, reject) {
directionsService.route({
origin: {'placeId': me.state.originId},
destination: {'placeId': me.state.destinationId},
travelMode: me.state.travelMode
}, function(response, status){
if (status === google.maps.DirectionsStatus.OK) {
// me.response = response;
directionsDisplay.setDirections(response);
resolve(response);
} else {
window.alert('Directions config failed due to ' + status);
}
});
});
return p1
},
render: function() {
return (
<div className="MapControl">
<h1>Search</h1>
<MapForm
onFormSubmit={this.handleFormSubmit}
map={this.state.map}/>
<GMap
setMapState={this.handleMapRender}
originId= {this.state.originId}
destinationId= {this.state.destinationId}
radius= {this.state.radius}
search= {this.state.search}/>
</div>
);
}
});