2011-12-10 7 views
0

私は本当に愚かであるか不足しているかどうかはわかりませんが、基本的には変数latitudeにアクセスしてparams変数に入れようとしています私は値を代入する関数の外のparamsの直前に変数の緯度を警告して、警告が空白に戻りますと、ポストリクエストで送信しますが、動作していないようです。私のコードは次のようになります:titanium-mobileで、関数外の値を得ることができない

var latitude; 



    Titanium.Facebook.requestWithGraphPath('me', {}, 'GET', function(e) { 
       if (e.success) { 
        var user = eval('('+e.result+')'); 

        var currentTime = new Date(); 
        var hours = currentTime.getHours(); 
        var minutes = currentTime.getMinutes(); 
        var month = currentTime.getMonth() + 1; 
        var day = currentTime.getDate(); 
        var year = currentTime.getFullYear();            

        if (Ti.Geolocation.locationServicesEnabled) { 
         Titanium.Geolocation.purpose = 'Get Current Location'; 
         Titanium.Geolocation.getCurrentPosition(function(e) { 
          if (e.error) { 
           alert('Error: ' + e.error); 
          } else { 
           latitude = e.coords.latitude; 
           longitude = e.coords.longitude; 
           accuracy = e.coords.accuracy; 
          } 
         }); 
        } else { 
         alert('Please enable location services'); 
        } 

        alert(latitude); 

        var params = { 
         username: user.username, 
         gender: user.gender,  
         lastOnline:day+"/"+month+"/"+year+" - "+hours+":"+minutes, 
         latitude:latitude, 
         //longitude:longitude, 
         //accuracy:e.coords.accuracy, 
        }; 

答えて

1

「これは非同期関数が同期的に動作することを期待しています」ということは間違いありません。私はチタンモバイルに精通していませんが、私はTitanium.Geolocation.getCurrentPositionが非同期関数であると推測しています。つまり、指定したコールバック関数は、次のステートメントalert(latitude);が実行されるまでには実行されません。この問題を解決するには

は、あなたがいない前に、設定するジオロケーションを必要とするものは、コールバック関数で呼び出されていることを確認する必要があります。

Titanium.Geolocation.getCurrentPosition(function(e) { 
    if (e.error) { 
     alert('Error: ' + e.error); 
    } else { 

     var params = { 
      username: user.username, 
      gender: user.gender,  
      lastOnline: day+"/"+month+"/"+year+" - "+hours+":"+minutes, 
      latitude: e.coords.latitude, 
      longitude: e.coords.longitude, 
      accuracy: e.coords.accuracy 
     }; 

     // now do something with params 
     initializeStuff(params); 
    } 
}); 
+0

が、その後にしようとしたとき、私は同じ問題を取得することはありませんアクセスパラメータ?しかし、私は関数内で必要なことをすることができます。私は将来考えていますが、関数の外からアクセスする必要があるかもしれません。 –

+0

コールバックが返ってきた限り、コールバックの外側からアクセスできます。上記の私の編集を参照してください - 必要な情報を非同期的にフェッチしているときの共通のアプローチは、コールバックの本体で初期化関数を開始することです。 – nrabinowitz

関連する問題