HTML5 navigator.geolocation - асинхронность
От: Слава  
Дата: 08.05.18 22:11
Оценка:
В современных браузерах существует возможность получить координаты юзера. Обычно это делается конструкцией вида:
if (navigator.geolocation) {
     navigator.geolocation.watchPosition(showPosition);
} else {
...
}
И обычно эта конструкция вешается на событие готовности загрузки страницы (через JQuery):
$(document).ready(function () {
    if (navigator.geolocation) {

А является ли асинхронным сам вызов
if (navigator.geolocation)
?
Ведь он (вроде бы) приводит к появлению всплывающего окошка браузера с текстом вроде "Этот сайт хочет отслеживать ваше местоположение, разрешить?" и парой кнопок. При этом, мне непонятно, будет ли вызываться последующий код, понавешанный на событие готовности страницы с помощью:
$(document).ready(function () {
А может быть вообще не стоит ожидать полной готовности страницы? Пусть себе запрос к пользователю и последующая работа с полученными координатами идут параллельно с загрузкой страницы.

Как лучше сделать?
Re: HTML5 navigator.geolocation - асинхронность
От: Ops Россия  
Дата: 09.05.18 07:23
Оценка:
Здравствуйте, Слава, Вы писали:

С>А является ли асинхронным сам вызов

С>
if (navigator.geolocation)
?


Так тут же объект, а не промис, значит все синхронно. Вообще не помню, чтобы проперти бывали асинхронными. А вот watchPosition() и getCurrentPosition() уже асинхронные, они-то и "вернут" ошибку, если не дали разрешения.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: HTML5 navigator.geolocation - асинхронность
От: vsb Казахстан  
Дата: 09.05.18 07:33
Оценка:
Здравствуйте, Слава, Вы писали:

С>А является ли асинхронным сам вызов

С>
if (navigator.geolocation)
?


В JavaScript нет неявной асинхронности. В браузерном API также практически нет блокирующих вызовов. Что написано, то и происходит. Данный код по сути проверяет, есть ли у объекта navigator свойство geolocation, то бишь поддерживает ли вообще браузер данное API.

С>Ведь он (вроде бы) приводит к появлению всплывающего окошка браузера с текстом вроде "Этот сайт хочет отслеживать ваше местоположение, разрешить?" и парой кнопок.


Нет, это окошко появится после вызова watchPosition. Если пользователь разрешит, то будет вызываться переданная парметром функция.

C> При этом, мне непонятно, будет ли вызываться последующий код


Будет. Хотя сама причина, почему непонятно — непонятна. Поставь там console.log и экспериментируй, чего гадать.

С>А может быть вообще не стоит ожидать полной готовности страницы? Пусть себе запрос к пользователю и последующая работа с полученными координатами идут параллельно с загрузкой страницы.


Почему бы и нет. Просто учти, что у тебя в момент вызова твоего коллбэка страница может быть ещё не загружена.

С>Как лучше сделать?


По-мне проще делать как ты сейчас делаешь, меньше думать, что у тебя там загрузилось, не загрузилось. С другой стороны если ты можешь раньше сделать что-то осмысленное и пользователю это будет полезно, возможно лучше и так.
Re: HTML5 navigator.geolocation - асинхронность
От: sambl74 Россия  
Дата: 17.05.18 06:07
Оценка:
Здравствуйте, Слава, Вы писали:

С>А является ли асинхронным сам вызов

С>
if (navigator.geolocation)
?


О, геолокация. Я на ней собаку съел

Этот вызов синхронный, так как он просто проверяет, есть ли объект геолокацкии у браузера — т.е. просто поддерживается ли такая фича.

С>Ведь он (вроде бы) приводит к появлению всплывающего окошка браузера с текстом вроде "Этот сайт хочет отслеживать ваше местоположение, разрешить?" и парой кнопок. При этом, мне непонятно, будет ли вызываться последующий код, понавешанный на событие готовности страницы с помощью:

С>
$(document).ready(function () {
А может быть вообще не стоит ожидать полной готовности страницы? Пусть себе запрос к пользователю и последующая работа с полученными координатами идут параллельно с загрузкой страницы.


Следующей строчкой с watchPositions он собственно и сделает запрос, результат будет передан в фукнцию по готовности. А запрос параллельно с загрузкой страницы приведёт к тому, что страница запросит геолокацию у пользователя, когда ещё может толком ничего и не загружено, и в этом случае он навряд ли разрешит это действие

С>Как лучше сделать?


Использовать Google Map Geolocation API — ссылка.

1. Нет окна запроса геолокации у пользователя — а с этим окном бывают большие проблемы, если браузер встроен — можно обойти, вписав permission в настройках браузера, но это некошерно и не всегда возможно;
2. Работает и на HTTP ресурасах — свежие бразуеры разрешают naviagtor.geolocation только на https ресурсах. Ну и на localhost для отладки

Правда скоро это апи будет платным, надо смотреть какие там бесплатные лимиты.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.