私はGeolocation
を使用するイオンコードバのアプリを開発中です。SetTimeoutを正しく使う方法(typescript)
アプリの流れによれば、正確な位置を取得する必要があります。
私は場所を達成するための専用の方法を書いて、その中にsetTimeout
を使用しました。
私の記録によると、私はsetTimeout
を正しく使用しなかったようです - あるいは最悪の場合は私が選んだもので、setTimeout
は私が必要としているものではありません。
これは私のコードです:
getFixedLocation() {
let coordinates: Coordinates;
let maxTries = 15;
let isFixedLocation = false;
this.forceFixLocation(10);
do {
console.log("Getting location, try #" + maxTries)
this.geolocation.getCurrentPosition(GEOLOCATION_OPTIONS)
.then((position) => {
coordinates = position.coords;
});
if (coordinates.accuracy < 25 && coordinates.speed < 1) {
isFixedLocation = true;
} else {
maxTries -= 1;
}
} while(maxTries > 0 && !isFixedLocation);
if (isFixedLocation) {
return coordinates;
} else {
return null;
}
}
forceFixLocation(counter: number) {
setTimeout(() => {
if(counter > 0) {
console.log("Forcing location #" + counter)
this.geolocation.getCurrentPosition(GEOLOCATION_OPTIONS)
.then((position) => {
console.log("Got position, accuracy: " + position.coords.accuracy)
});
this.forceFixLocation(counter - 1);
}
}, 3000);
}
ログの表情は、明らかに私のdo-while
ループはforceFixLocation
の最初の反復前に実行されていること:
08-15 00:58:51.831 D/SystemWebChromeClient(19622): file:///android_asset/www/build/main.js: Line 56358 : Getting location, try #15
08-15 00:58:51.831 I/chromium(19622): [INFO:CONSOLE(56358)] "Getting location, try #15", source: file:///android_asset/www/build/main.js (56358)
08-15 00:58:51.831 D/GeolocationPlugin(19622): We are entering execute
08-15 00:58:51.841 D/SystemWebChromeClient(19622): file:///android_asset/www/build/main.js: Line 1362 : ERROR
08-15 00:58:51.841 I/chromium(19622): [INFO:CONSOLE(1362)] "ERROR", source: file:///android_asset/www/build/main.js (1362)
08-15 00:58:54.834 D/SystemWebChromeClient(19622): file:///android_asset/www/build/main.js: Line 56381 : Forcing location #10
08-15 00:58:54.844 I/chromium(19622): [INFO:CONSOLE(56381)] "Forcing location #10", source: file:///android_asset/www/build/main.js (56381)
08-15 00:58:54.844 D/GeolocationPlugin(19622): We are entering execute
08-15 00:58:56.936 D/SystemWebChromeClient(19622): file:///android_asset/www/build/main.js: Line 1362 : ERROR
08-15 00:58:56.946 I/chromium(19622): [INFO:CONSOLE(1362)] "ERROR", source: file:///android_asset/www/build/main.js (1362)
08-15 00:58:57.847 D/SystemWebChromeClient(19622): file:///android_asset/www/build/main.js: Line 56381 : Forcing location #9
08-15 00:58:57.847 I/chromium(19622): [INFO:CONSOLE(56381)] "Forcing location #9", source: file:///android_asset/www/build/main.js (56381)
ここで正しいアプローチは何ですか?
私は現在のコードで何が起こるのか理解しています。問題はそれを修正する方法です。そうすれば、do-whileロジックは 'forceFixLocation'を10回呼び出した後にのみ実行されます。 – user1692261
do - whileロジックを別の関数に抽出し、それをforceFixLocationから呼び出します。 – Nosyara