0

デバイスの位置を表すオブジェクトを返す関数を作成しようとしています。試しました。

  function getDevicePosition () {
    var positionObject;
    if (isDeviceReady) {
        navigator.geolocation.getCurrentPosition(function (position) {

            positionObject = position;
            console.log('location updated');
            console.log(positionObject.coords.longitude);//1. works
        }, function (err) {
            console.log('Failed to get device position' + err);
            return null;
        });

    } else {
        warnUser();
        return null;
    }
    console.log(positionObject.coords.longitude);//2. doesnt work as positionObject is null.
    return positionObject;
}

ステートメント1とステートメント2をマークするコメントを追加したことに注意してください。ステートメント1で位置オブジェクトを初期化した場合、ステートメント2で未定義なのはなぜですか。

4

2 に答える 2

1

getCurrentPosition非同期メソッドだからです。としてマークされた行は2、コールバック関数が実行される前に実行されるため、positionObject引き続き実行されますundefined

positionObjectコールバック内に依存するすべてのコードをに移動する必要がありますgetCurrentPosition

于 2012-09-28T10:01:55.347 に答える
1

の呼び出しnavigator.geolocation.getCurrentPosition()は非同期であるため、残りの関数の実行は終了するまで待機しません。

したがって、関数は基本的に次のように実行されます。

function getDevicePosition () {
    var positionObject;
    if (isDeviceReady) {
        // trigger some asynch function ...
    } else {
        warnUser();
        return null;
    }
    console.log(positionObject.coords.longitude);
    return positionObject;
}

このコードから、その時点でコードがconsole.log()positionObjectに到達することが設定されていないため、エラーが発生することは明らかです。

編集

あなたのコメントに関して。このようなタスクの一般的な設計原則は次のとおりです。

// original function (triggered by a button or whatever)
function trigger() {
  // do some calculations before

  // trigger the position-retrival
  navigator.geolocation.getCurrentPosition(function (position) {
    // get the position
    // ...

    // call the handling function
    doStuff( position );
  });
}

// the function to do stuff based on the position
function doStuff( position ) {
// ...
}
于 2012-09-28T10:03:13.503 に答える