2016-05-18 17 views
0

myFn.getMyCurrentPosition(data、function(data){//非同期コール、コールバックのようなデータを使用する必要がある - このセクションは機能しません。そして成功したコールバックのようなさまざまな機能でそれを使用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.; 

      } 
     }); 
    } 
} 

更新:?TRIED THIS:

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(); 

このエラーを取得: 'ジオロケーション' on 'にgetCurrentPosition' を実行に失敗しました:として提供したコールバックをパラメータ1は関数ではありません。

+0

のための三番目のパラメータとしてタイムアウトを追加します。 – tymeJV

+0

編集された質問 –

答えて

2

myFn.getMyCurrentPositionを呼び出すと、2つの引数(dataと関数)を渡します。

あなたはそれを定義した:

function() { 

をあなたが任意の引数を受け入れるためにそれを教えてくれませんでした(とあなたがどちらかargumentsオブジェクトを使用していませんでした)。

あなたが何かをしたい場合は、渡す引数を実際に使用する必要があります。

+0

ありがとうございました。実際には何も渡す必要はありません、返された位置座標を使用してください。 getMyCurrentPositionが呼び出されるローカル変数もあるので、それらと位置座標を使用したいと思います。それを行う方法はありますか?したがって、基本的には、位置/データが設定された後、つまり何も渡さずにデータが返された後にコールバックするだけです。 –

+0

var map = something; myFn.getMyCurrentPosition(function(data){//データは位置にする必要があります - lat/long ...}); –

+2

返される座標はありません。これは非同期関数です。非同期関数から戻ることはできません。それがコールバックを渡す理由です。 – Quentin

1

私は地理的位置の状態にすべてのpromisifyを照会&を要求するためのサポートと、それの拡張版/ポリフィルを構築している新しいPermission api
のようなものを試してみてください: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は、success/errorコールバック内のmyInitializerコールのthis.methodの代わりに変数myFn.methodを参照する必要があります。 locationSuccess/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(); 

別の問題が知られている:そう... `getMyCurrentPosition`がパラメータを取らない

navigator.geolocation.getCurrentPosition(this.locationSuccess, this.locationError, {**timeout:1000**}); 
関連する問題