2016-05-18 3 views
0

myFn.getMyCurrentPosition (данные, функция (данные) {// Асинхронный вызов, нужно использовать данные как обратный вызов - этот раздел не работает. Как использовать текущие координаты позиции и использовать его в другую функцию как преуспевающим обратного вызоваgelocation - асинхронный обратный вызов не работает с ошибкой - Javascript

var myFn = { 
    this.localVar : null, 
    mysuccess : function (position) { 
     this.myLocalVar = position.coords.latitude + ','+ position.coords.longitude; 
     return this.myLocalVar; 
    }, 
    myerror : function (error) {  
     return null; 
    }, 
    getMyCurrentPosition : function() { 
     if(navigator && navigator.geolocation) { 
      //WORKS - mysuccess sets data asyncrhonously. 
      return navigator.geolocation.getCurrentPosition(this.mysuccess, this.myerror);   
     } 
    }, 
    myInitializer : function(){ 
     //Initialize map, marker etc. for google maps API 
     myFn.getMyCurrentPosition(function(){ //Async call, need to use data like a callback 
      //This code never runs! 
      if(this.myLocalVar){ 
       //doSomethingAfterCall - using this.myLocalVar, map, etc.; 

      } 
     }); 
    } 
} 

Update: ПРОБОВАЛИ эТО:

var myFn = { 
    mysuccess: function (position) { 
     myFn.myInitializer(); 
    }, 
    myerror: function (error) { 
     myFn.myInitializer(); 
    }, 

    myInitializer : function(){ 
     //Initialize map, marker etc. for google maps API 
    }, 
    onLoadSet : function(){ 
     navigator.geolocation.getCurrentPosition(this.mysuccess, this.myerror); 
    } 

} 

myFn.onLoadSet(); 

Получить эту ошибку: Не удалось выполнить «getCurrentPosition» на «геолокации» с обратным вызовом при условии, как параметр 1 не является функцией.

+0

'getMyCurrentPosition' не принимает никаких параметров ... так. – tymeJV

+0

отредактировал вопрос –

ответ

2

Когда вы вызываете myFn.getMyCurrentPosition, вы передаете ему два аргумента (data и функцию).

Когда вы определили его:

function() { 

Вы не сказать ему, чтобы принимать какие-либо аргументы (и вы не использовали arguments объект либо).

Вам нужно использовать аргументы, которые вы передаете, если вы хотите с ними что-то сделать.

+0

Спасибо за помощь. на самом деле мне не нужно ничего пропускать, просто используйте координаты возвращенной позиции. У меня также есть некоторые локальные переменные, где выполняется вызов getMyCurrentPosition, поэтому я хочу использовать их и координаты позиции. Есть ли способ сделать это. Таким образом, в основном, мне нужно только обратный вызов после установки позиции/данных, т. Е. Вернуть данные, не передавая ничего. –

+0

var map = что-то; myFn.getMyCurrentPosition (функция (данные) {// данные должны быть позицией - lat/long ...}); –

+2

Возвращенных координат нет. Это асинхронная функция. Вы не можете вернуться из функции async. Вот почему мы проходим обратные вызовы. – Quentin

1

Попробуйте что-то вроде нового Permission api
Я построил расширенную версию/polyfill его с поддержкой запроса & запросов от состояния геолокации все promisify: browser-su

/*************** 
* query * 
***************/ 
su.query({ 
    name: 'geolocation' 
}).then(permission => { 
    console.log(permission) // {state, onchange} 
    console.log(permission.state) // granted, prompt or denied 
}) 


/*************** 
* request * 
***************/ 
su.request({ 
    name: 'geolocation', 
    timeout: 5000 // Optional 
}).then(position => { 
    console.log(position) 
} err => { 
    console.log(err.name, err.message) 
    // RequestDeniedError  User blocked access to geolocation 
    // RequestDismissedError User dismissed access to geolocation 
    // RequestTimeoutError  Timeout expired 
    // RequestUnavailableError Position is unavailable 
    // RequestUnsupportedError This client dose not seem to have geolocation support 
}) 

Firefox также будет скоро иметь поддержку для отзыва разрешения

+0

спасибо, я попробую это! –

0

Это то, что сработало. Я попробовал другой подход, но, вероятно, испортил что-то в своем синтаксисе. Это была пара проблем: JS должен ссылаться на переменную myFn.method вместо this.method для вызова myInitializer в обратном вызове успеха/ошибки. Так как ожидается, что querySuccess/error вызваны обратными вызовами, this.locationSucess работает в обратном вызове для getcurrentPosition.

var myFn = { 
    locationSuccess: function (position) { 
     myFn.myInitializer(position.coords); 
    }, 
    locationError: function (error) { 
     myFn.myInitializer(); 
    }, 

    myInitializer : function(data){ 
     //Initialize map, marker etc. for google maps API 
     //if(data) { doSomething(); } 
     //else { doSomethingElse(); } 

    }, 
    onLoadSet : function(){ 
     navigator.geolocation.getCurrentPosition(this.locationSucess, this.locationError, {timeout:1000}); 
    } 

}; 

myFn.onLoadSet(); 

Другой вопрос известен: Добавить таймаут в качестве третьего параметра для

navigator.geolocation.getCurrentPosition(this.locationSuccess, this.locationError, {**timeout:1000**});