Я новичок в программировании javascript, и я пытаюсь понять процесс async. Я начал проект, и я хотел бы знать, как выполнить код ниже как синхронизацию. Я видел много учебников, но большинство из них настолько поверхностны ...
Код прост, его вызов Google Maps api, который передает адрес и возвращает широту и долготу. После этого он должен вызвать передачу сервера lat lng через url и вернуть все местоположения рядом с указанным местоположением.
Клиент:
$scope.findLocations = function () { var dist = 0.1; //execute this
getLatLong(); //before this
$http.get('/api/locations/findByLocation/'+$scope.form.lng+'/'+$scope.form.lat+'/'+dist)
.success(function(data) {
$scope.locations = data;
$scope.form = {};
console.log("locations: ", data);
})
.error(function(data) {
console.log('Error: ' + data);
});};var getLatLong = function() { var geo = new google.maps.Geocoder; var address = $scope.form.adress; console.log(address); geo.geocode({'address':address},function(results, status){
if (status == google.maps.GeocoderStatus.OK) {
console.log("Status geocoder OK");
$scope.form.lat = results[0].geometry.location.lat();
$scope.form.lng = results[0].geometry.location.lng(); var latlng = new google.maps.LatLng($scope.form.lat,$scope.form.lng); var mapProp = {
center:latlng,
zoom:18,
mapTypeId:google.maps.MapTypeId.ROADMAP,
mapTypeControl: false
}; var map=new google.maps.Map(document.getElementById("map"),mapProp);
var marker = new google.maps.Marker({
position: latlng,
map: map,
title:name
}); } else {
alert(status);
} });};
Сервер:
router.get('/api/locations/findByLocation/:lng/:lat/:dist', function(req, res){var coords = [];
coords[0] = req.params.lng;
coords[1] = req.params.lat;Location.find({
loc: {
$near: coords,
$maxDistance: req.params.dist
}
}).limit(30).exec(function(err, locations){ if(err){
res.json(err);
console.log(err);
} res.json(locations);
});});
Используйте JS Promise для этого
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
Вы должны проверить, как Promise работает в JavaScript. вот пример:
Официальное обещание api
угловое 1 выполнение обещания
Я предпочитаю работать с цепочками "это", "то", "то" в javascript, используя обещания. Это что-то вроде кривой обучения, но она делает простой поддерживаемый код при работе с асинхронными вызовами API. Начните с включения зависимости $ q в ваш angular сервис? (из кода, размещенного внутри, неясно, какой angular компонент выполняются ваши звонки).
Вот как это будет выглядеть в вашем примере:
Вызов
geo.geocode({'address':address},function(results, status){...}
является асинхронным вызовом. Это означает, что он вызовет API Карт Google, и следующие строки вашего кода будут выполнены без ожидания ответа.Вторым параметром этого вызова является обратный вызов:
function(results, status){...}
, Этот обратный вызов является функцией, которая будет выполняться только после того, как асинхронный вызов завершит свой процесс.Чтобы выполнить вызов на ваш сервер после возврата API Карт Google, вам необходимо кодировать этот вызов внутри обратного вызова. Примерно так:
Вы можете найти больше информации о http-вызове здесь.