2015-04-25 3 views
0

Это может быть новичок, но я пытаюсь создать функцию, которая возвращает true. Однако это основано на том, что происходит внутри нескольких других функций внутри.Лучший способ «вернуть истину» на основе условий от вложенных функций

function checkGeo(){ 

    // CHECK FOR GEOLOCATION 
    if("geolocation" in navigator) { 

     navigator.geolocation.getCurrentPosition(function(position){ 
      sessionStorage.pinlat = position.coords.latitude; 
      sessionStorage.pinlon = position.coords.longitude; 
      // position object is set! 
     }); 

     // position is not defined 
     if (position.coords.latitude && position.coords.longitude){ 
      return true; 
     } 

    } 

} 

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

Ввод этого условия в функцию успеха getCurrentPosition и возврат истины оттуда не делает checkGeo возвратом true. Как проверить, завершилась ли эта асинхронная функция и, следовательно, проверить ее результаты для return true?

+1

Получает ли 'getCurrentPosition' асинхронный веб-запрос случайно? –

+0

@WiktorZychla Да, я думаю, это – Downgoat

+0

Из спецификации: «При вызове он должен немедленно вернуться, а затем асинхронно попытаться получить текущее местоположение устройства». Также я слышу («геолокация» в навигаторе) является наименее ресурсоемким на устройстве/подключении. – BenRacicot

ответ

1

У вашей функции есть finished переменной

function checkGeo(){ 
    var self = this; 
    this.ready = function() {} 
    this.result = false; 
    if("geolocation" in navigator) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
      sessionStorage.pinlat = position.coords.latitude; 
      sessionStorage.pinlon = position.coords.longitude; 
      self.result = (position.coords.latitude && position.coords.longitude); 
      self.ready.call(self); 
     }); 
    } 
} 

Теперь вы может использовать эту функцию:

var run = new checkGeo(); 
run.ready = function() { 
    alert(this.result); //Both work 
    alert(run.result); //Both work 
}; 

Немного сложнее, но лучше программировать, на мой взгляд.

+0

Я не получу большую часть этого, не могли бы вы изложить? Кажется, что 'self' не имеет метода' ready'. Только «это» делает. Кроме того, 'self.result'« законченный »var, о котором вы говорите? – BenRacicot

+0

@BenRacicot JavaScript немного странный. 'self' на самом деле ссылается на checkGeo' this'. Поскольку '.getCurrentPosition' имеет разную область действия, нам нужно использовать' self', чтобы мы могли получить к нему доступ. 'var self = this' на самом деле не создает копию этого, скорее как ссылку. [Вот вопрос] (http://stackoverflow.com/questions/337878/var-self-this) – Downgoat

+0

Хорошо, я думаю, у меня это есть. 'run.ready' на самом деле имеет область' getCurrentPosition', как мы можем схватить .result от этого? – BenRacicot

1

position в анонимной функции не совпадает с position в заявлении if после него. Область применения JavaScript (игнорирование ключевого слова ES6 let для простоты) осуществляется по функциям.

Кроме того, если getCurrentPosition() является асинхронным, вы не можете полагаться на функцию анонимного обратного вызова, которая запускается раньше всего.

Если все, что вы хотите return true, чтобы показать, что вы пытаетесь получить геолокации информацию без каких-либо гарантий, что вы будете успешны, использовать что-то более, как это:

function checkGeo(){ 
    var hasGeolocation = false; 

    // CHECK FOR GEOLOCATION 
    if("geolocation" in navigator) { 
     hasGeolocation = true; 

     navigator.geolocation.getCurrentPosition(function(position){ 
      sessionStorage.pinlat = position.coords.latitude; 
      sessionStorage.pinlon = position.coords.longitude; 
      // position object is set! but only inside this function. 
     }); 

     return hasGeolocation; 
    } 
} 

С другой стороны, если вы пытаются указать return true, что геолокация была успешно установлена, тогда вам нужно указать ее каким-то другим способом, чем возвращаемое значение синхронной функции, потому что вы не будете знать, что она будет установлена ​​(может произойти ошибка, пользователь может запретить геолокацию для вашего сайта и т. д.), пока асинхронная функция не вызовет обратный вызов.

+0

Я не согласен.Это не определяет, действительно ли у меня место, правильно? +1 для обзора! * headdesk * – BenRacicot

+0

Правильно, он не говорит вам, есть ли у вас местоположение, просто есть средство для поиска местоположения. Я указываю, что в тексте выше кода. – Trott

+0

Спасибо за помощь ур. Может быть, вопрос более конкретно: как наблюдать за 'getCurrentPosition()' для завершения и проверки его значений, тогда возвращаем true, если они отвечают условиям. – BenRacicot

0

Вызов геолокации асинхронный, поэтому вы не можете вернуть результат из функции. Когда функция заканчивается, вы еще не знаете результат асинхронного вызова. Возвращение чего-либо из обратного вызова для асинхронного вызова не приведет к возврату значения функции, поскольку функция уже вернулась.

Вы можете использовать обратный вызов, чтобы сообщить результат. Вы должны использовать код, который проверяет позицию в функции обратного вызова для асинхронного вызова:

function checkGeo(callback){ 
    if("geolocation" in navigator) { 
    navigator.geolocation.getCurrentPosition(function(position){ 
     sessionStorage.pinlat = position.coords.latitude; 
     sessionStorage.pinlon = position.coords.longitude; 
     callback(position.coords.latitude && position.coords.longitude); 
    }); 
    } else { 
    callback(false); 
    } 
} 

Использование:

checkGeo(function(exists){ 
    // here you can use the result 
    if (exists) { 
    // ... 
    } 
}); 
+0

* mind blown * так что создайте свои собственные обратные вызовы, чтобы следить за успехом, ожидая завершения функций async? Я получаю ошибку «обратный вызов не является функцией»? – BenRacicot

+0

@BenRacicot: Проверьте орфографию и отправьте функцию в вызове. – Guffa

+0

Это действительно имеет смысл, нет функции, называемой «обратный вызов», и, конечно, ее сообщение об ошибке. Можете ли вы объяснить, как отправка по функции будет работать без псевдокода? – BenRacicot

Смежные вопросы