2017-08-14 9 views
0

私は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) 

ここで正しいアプローチは何ですか?

答えて

0

forceFixLocationのラムダ関数は、3秒後に最初に呼び出されます。 this.forceFixLocation(10);getFixedLocationから呼び出すと、すぐに次の行に進み、whileのロジックを実行します。 それ以上の場合、getFixedLocationは既に値を返すかもしれませんが、あなたはまだ3秒(10回)ごとに呼び出されるforceFixLocationを取得します。

+0

私は現在のコードで何が起こるのか理解しています。問題はそれを修正する方法です。そうすれば、do-whileロジックは 'forceFixLocation'を10回呼び出した後にのみ実行されます。 – user1692261

+0

do - whileロジックを別の関数に抽出し、それをforceFixLocationから呼び出します。 – Nosyara

0

ここには基本的な情報がありません。そして、それはJavaScriptイベントループです!

あなたはそれだろう決して(これまでに)最後のでdo whileを使用することはできませんし、ログが示すように、アプリケーションがハングします。

また、あなたが約束している解決を待っているようには見えません。thenメソッドは、将来提供される可能性のある機能です。あなたのdo/whileは、この約束に解決できないようにアプリケーションをハングアップします...

私はasync/awaitを試してみることをお勧めします。

+0

ありがとうございます。あなたはそれで私を助けることができますか?私はasync/awaitについて読んでいますが、do whileのロジックを非同期/待機に変更する方法がわかりません。 – user1692261

+0

私はあなたが達成しようとしている論理が何であるか分かりません...コードを非同期/待機に変換する方法に関する新しい質問を開くことをお勧めします – gilamran

関連する問題