2011-08-25 31 views
14

私の質問はJavascriptについてです。 私は、成功したコールバックでPositionオブジェクトを受け取るコールバック関数を持っています。Javascriptコールバック関数の戻り値をグローバル変数に割り当てる

問題は、私は成功したコールバックでグローバル変数に位置オブジェクトのプロパティを設定しようとすると、それはちょうど私がそれを行うことはできません。また、グローバルだけで未定義のままであることです。

オブジェクトプロパティをグローバル変数に直接設定するのではなく、コールバック関数で返すようにしていますが、コールバック関数の戻り値をグローバルに設定する方法が見つかりませんでした変数。

ここでは単純化されたコードです。

var x; 

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

//on Successful callback receives a Position Object 
function onSuccess(position) { 
    var coords = position.coords; 
    x=coords;  // Setting directly to an object does not work x still remains undefined after succesful callback    
return coord; // Trying to set this to a global object 

} 

// onError Callback receives a PositionError object 
// 
function onError(error) { 
    alert('code: ' + error.code + '\n' + 
      'message: ' + error.message + '\n'); 
} 

答えて

15

コールバック(この場合)から値を返すことはできません。つまり、getCurrentPositionの内部では、コールバックからの戻り値をどこかに割り当てる必要があります。

グローバル変数作品にそれを割り当てていますが、その変数にアクセスするときに、それはまだ新しい値を割り当てられていませんでした。例えば。

// x is assigned in `onSuccess` 
var x; 
navigator.geolocation.getCurrentPosition(onSuccess, onError); 
alert(x); // will be undefined, the response is not processed yet 

それについて考える:getCurrentPositionはおそらく位置を取得するためにAjaxリクエストを行っています。このような要求は、(a)の時間(ミリ秒のカップルを)取り、そのため(b)の応答を受信するまでJavaScript を待たないことを意味非同期、です。あなたのコードはです。方法はです。 xにアラートを送信したときにonSuccessがまだ呼び出されていませんでした。

唯一のソリューション:であるか、またはコールバックから呼び出さするように位置をアクセスする必要が

すべてのコード。

+0

実際に良い点を、私の答えは私の一部に愚かな監督です。コードは線形ではないので、値がバインドされていることを確認するために、コールバックのコードで何をしたいのですか? – WickyNilliams

+0

実際には正しいです。getCurrentPosition関数は非同期のジオロケーションを取得しようとしていますそのため、グローバル変数からアクセスしようとすると、おそらく設定されておらず、undefinedを返すのです。非同期関数が終了した後で変数を代入する方法はありませんか? –

+0

@トルコジン:いいえ、どこに値を返す必要がありますか?つまり、コードは非同期で実行されます。そのため、値はパラメータとしてコールバック関数に渡され、コールバック関数を使用して必要なものを実行できるようになります。値を '返す 'ことができれば、' getCurrentPosition'がそれを行います。しかし、そうではないので、あなたはコールバックを提供しています。多分あなたはこの問題を理解するのに役立つ[この記事](http://felix-kling.de/blog/2011/01/14/how-to-return-data-from-an-ajax-call/)を見つけるでしょう(しかし私は書面ではそれほど良くはありません)) –

0

は、グローバルwindowオブジェクトを介して設定してみましたか?

//on Successful callback receives a Position Object 
function onSuccess(position) { 
    var coords = position.coords; 
    window.x=coords;  // Setting directly to an object does not work x still remains undefined after succesful callback    
return coord; // Trying to set this to a global object 

} 

また、成功ハンドラから座標を返すので、この値を取得する別の方法はありませんか?

0

もちょうどONSUCCESSの呼び出し後にそれを行う(放火犯とChromeとFFで動作)の値をチェックするだけでx=cords

console.log(x);を置きます。

またで説明したように、あなたがx

+0

実際に私は言及していませんが、すでにそれをやっています:) –

1

の値をチェックしたときに多分あなただけの答えを受けていない、(あなたがポジションを得るためにAJAXを使用している場合)非同期コードをJSであることを忘れないでくださいFelix Kingでは、コールバックから値を返すことはできません。また、グローバル変数バリアントでは、AJAXリクエストが完了してコールバック(したがってその名前!)をコールするまで、変数は設定されません。あなたが処理ループのいくつかの並べ替えを持っている場合、あなたはいつでもCOORDの変更が必要である何をするためにそのループにこのコードを追加することができ、あなたの問題を解決することができ、グローバル変数を使用して

if (coord) // global variable has a new value 
    // process it 
    alert('code: ' + error.code + '\n' + 
      'message: ' + error.message + '\n'); 
    // then clear it 
    coord = null; 
    } 
0

あなたが流れるようにヘルパーメソッドを実装することができます

var LocationHelper = function() {}; 

LocationHelper.prototype.getLocation = function(callback) { 

    navigator.geolocation.getCurrentPosition(onSuccess, onError); 

    function onSuccess(pos) { 
     callback({ 
      pos: pos 
     }); 
    } 

    function onError(message) { 
     callback({ 
      message: message 
     }); 
    } 

    }; 
関連する問題