Inilah situasi saya:
- pada this.handleFormSubmit () Saya menjalankan this.setState ()
- di dalam this.handleFormSubmit (), saya memanggil this.findRoutes (); - yang bergantung pada keberhasilan penyelesaian this.setState ()
- this.setState (); tidak selesai sebelum ini.findRoutes dipanggil ...
- Bagaimana cara menunggu this.setState () di dalam this.handleFormSubmit () selesai sebelum memanggil this.findRoutes ()?
Solusi di bawah standar:
- meletakkan this.findRoutes () di componentDidUpdate ()
- ini tidak dapat diterima karena akan ada lebih banyak perubahan status yang tidak terkait dengan fungsi findRoutes (). Saya tidak ingin memicu fungsi findRoutes () saat status yang tidak terkait diperbarui.
Silakan lihat cuplikan kode di bawah ini:
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>
);
}
});