[HW]Geolocation


0

Опитвам се да накарам това нещо да работи, но не ми се получава. Ако махна изцяло промиса и оставя само кода за гео локацията си работи, показва картата с пинче на нея, но като го вкарам в промиса и хвърчи някаква грешка на конзолата

let promise = new Promise((resolve, reject) => { document.getElementById('btn') .addEventListener('click', () => resolve()); }); promise.then(value => { var map, infoWindow; function initMap() { map = new google.maps.Map(document.getElementById('map'), { center: { lat: -34.397, lng: 150.644 }, zoom: 6 }); infoWindow = new google.maps.InfoWindow(); navigator.geolocation.getCurrentPosition(function (position) { var pos = { lat: position.coords.latitude, lng: position.coords.longitude }; infoWindow.setPosition(pos); infoWindow.setContent('Location found.'); infoWindow.open(map); map.setCenter(pos); }, function () { handleLocationError(true, infoWindow, map.getCenter()); }); } function handleLocationError(browserHasGeolocation, infoWindow, pos) { infoWindow.setPosition(pos); infoWindow.setContent(browserHasGeolocation ? 'Error: The Geolocation service failed.' : 'Error: Your browser doesn\'t support geolocation.'); infoWindow.open(map); } });




Отговори



1

Доколкото разбирам, в тялото на промиса се слага каквото асинхронно имаш за изпълнение (в случая - navigator.geolocation.getCurrentPosition), а в then-a слагаш обработката, която се очаква да направиш с данните от асинхронната операция.

Иначе казано:

let promise = new Promise(function(resolve, reject) { navigator.geolocation.getCurrentPosition(function(position) { resolve(position); }) }).then(function(position) { //parse, display, do whatever you will with the position that you receive });

При мен така сработва промиса.


от IvanS1991 (80 точки)


0
Абсолютно точно, няма нужда от бутони и тн... Само ти липсва функцията за error на getCurrentPosition и тогава може да го reject-неш Promise-a :).

от ktsvetanov (705 точки)


0

Значи структурата на промиса трябва да е нещо такова?

let promise = new Promise(function (resolve, reject) { navigator.geolocation.getCurrentPosition(function (position) { resolve(position); }); }); promise.then(function (position) { var map, infoWindow; function initMap() { map = new google.maps.Map(document.getElementById('map'), { center: { lat: -34.397, lng: 150.644 }, zoom: 6 }); infoWindow = new google.maps.InfoWindow(); var pos = { lat: position.coords.latitude, lng: position.coords.longitude }; infoWindow.setPosition(pos); infoWindow.setContent('Location found.'); infoWindow.open(map); map.setCenter(pos); } function handleLocationError(browserHasGeolocation, infoWindow, pos) { infoWindow.setPosition(pos); infoWindow.setContent(browserHasGeolocation ? 'Error: The Geolocation service failed.' : 'Error: Your browser doesn\'t support geolocation.'); infoWindow.open(map); } });

Обаче не работи. Смисъл нещо не мога да се оправя с goole maps API-то явно, някой има ли идея? Може и идея за други карти ако са по-лесни за ползване в случая.


от olebg (598 точки)


0
var src = `http://maps.googleapis.com/maps/api/staticmap?center=${pos.lat},
${pos.long}&zoom=18&size=500x500&sensor=true`;

map.setAttribute('src', src);

Може да ползваш това. pos.lat и pos.long са ти координатите, които вземаш от navigator.geolocation.getCurrentPosition.

После този URL го сетваш като src na img елемент.


от ssslavev (155 точки)

0

Колега, пробвай да викаш просто Google API-то през линк, който да слагаш на src на img елемента ти. Линкът за картата трябва да е такъв (плюс мининус някакви компненти в url-a който искаш/неискаш):

https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&markers=color:red%7Clabel:You%7C${latitude},${longitude}&zoom=14&size=640x640&scale=2`


от mkanovski (552 точки)



0
А втората задача до къде я докарахте, някой може ли да помогне?

от Cvetinn (35 точки)


0

Аз направих нещо, ама въобще не съм сигурен в него :D Смисъл не съм сигурен дали съм разбрал правилно условието.

let timeout = 2000; let promise = new Promise(function (resolve, reject) { resolve(alert("<div>")); }); promise.then(value => { setTimeout(function () { window.location.href = "http://stackoverflow.com"; }, timeout); });


от olebg (598 точки)

0

Ако го разбирам правилно - иска се когато изпълниш скрипта да се появи поп-ъп див (евентуално с някакъв текст) и 2 секунди след като се появи поп-ъпа да те редиректне към еди кой си сайт.

Или нещо такова:

// 1 - Create pop-up div // 2 - Wait for two seconds const promise = new Promise((resolve, reject) => { setTimeout(resolve, 2000); }); // 3 - And then... promise.then(function() { // redirect to some URL });

В този ред на мисли - някой знае ли къде трябва да оценяваме домашните, че или аз недовиждам, или просто още не е активно оценяването?


от IvanS1991 (80 точки)