Я работаю в Javascript в проекте API Карт для работы. У меня возникают проблемы с функцией обратного вызова, которую я передаю в GetLocations
, в которой он должен вызывать другой фрагмент кода (все обратные вызовы хранят lat и lng в объекте). Но после того, как функция выполняет свою работу, следующая функция не вызывается.
Как работает эта обратная связь? Почему я не могу назвать какие-либо функции? Что я могу сделать в нем?
Хорошо, что тестовая функция (которая только что сделала окно с предупреждением), которую я использовал, начала волшебную работу снова, и я проверил журнал ошибок (который я забыл ранее), чтобы увидеть, что происходит не так.
Javascript использует структуру прототипа для выполнения своего рода OO, а функция, которую нужно вызвать, называется "this.Create". Ошибка говорит, что нет такой функции, но она позволяет мне вызвать ее из другого места в коде:
for (var i=0;i<mapObjects.length;i++) {
mapObjects[i] = new mapObject(mapObjects[i]);
mapObjects[i].Create(); //this works
}
mapObject.prototype.SetLocation=function (response) {
this.geoStatusCode = response.Status.code;
alert("entered SetLocation with status code "+this.geoStatusCode);
if (this.geoStatusCode == 200) {
this.lat = response.Placemark[0].Point.coordinates[1];
this.lng = response.Placemark[0].Point.coordinates[0];
alert("calling create()");
this.Create(); //"no such function"
} else {
this.geofailed++;
}
}
Я не очень хорошо знаком с Javascript и не понимаю прототипа или как он работает, поэтому я понятия не имею, как это решить. Кто-нибудь знает?
Вы можете делать все, что угодно, от функции обратного вызова. В документации Google есть отличный пример о том, как использовать Geocoder. Я слегка расширил свой пример:
var map;
var geocoder = new GClientGeocoder();
function addAddressToMap(response) {
map.clearOverlays();
if (!response || response.Status.code != 200) {
alert("\"" + address + "\" not found");
} else {
place = response.Placemark[0];
point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
marker = new GMarker(point);
map.addOverlay(marker);
marker.openInfoWindowHtml(place.address + '<br><b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode);
// DO WHATEVER YOU WANT HERE
}
}
geocoder.getLocations("New York City", addAddressToMap);
В качестве альтернативы вы можете распечатать функцию обратного вызова inline:
var map;
var geocoder = new GClientGeocoder();
geocoder.getLocations(address, function() {
map.clearOverlays();
if (!response || response.Status.code != 200) {
alert("\"" + address + "\" not found");
} else {
place = response.Placemark[0];
point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
marker = new GMarker(point);
map.addOverlay(marker);
marker.openInfoWindowHtml(place.address + '<br><b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode);
// DO WHATEVER YOU WANT HERE
}
});
Вы можете вызвать другие функции javaScript из обратного вызова GetLocations. Я предлагаю вам загрузить свою страницу в Firefox и проверить журнал ошибок. Если ваши проблемы сохраняются, отправьте здесь код и, надеюсь, мы сможем помочь.