如何正确使用SetTimeout(打字稿)

如何正确使用SetTimeout(打字稿)

问题描述:

我正在使用Geolocation的离子科尔多瓦应用程序。如何正确使用SetTimeout(打字稿)

根据应用程序流程,有必要得到一个准确的位置。

我写了专门的方法来实现位置,我在其中使用了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) 

什么是这里的正确的做法?

forceFixLocation内部的lambda函数将在3秒后第一次被调用。当你从getFixedLocation呼叫this.forceFixLocation(10); - 它立即继续到下一行并执行while的逻辑。 不止于此,getFixedLocation可能已经返回一些值,但您仍然会每3秒钟(10次)调用forceFixLocation

+0

我明白当前代码会发生什么。问题是如何修改它,以便do-while逻辑只有在所有10次调用'forceFixLocation'后才会执行。 – user1692261

+0

提取做 - 而逻辑分成单独的功能,并从forceFixLocation调用它。 – Nosyara

您在此处缺少基本信息。这是JavaScript事件循环的

你不能使用do while因为它会永远(曾经)结束,将挂起你的应用程序,如日志表示。

它也看起来像你不等待承诺解决..承诺提供的then方法只是一个可能/将来会发生的功能。你的do/while挂起的应用程序,所以它不能解决这个承诺...

我会建议尝试异步/等待,因为它提供了一个类似的语法,你期望摆脱JavaScript。

+0

谢谢。你能帮助我吗?我读了异步/等待,但我不知道如何修改'do while'逻辑异步/等待。 – user1692261

+0

我不确定你试图达到的逻辑是什么......我最好打开一个关于如何将代码转换为异步/等待的新问题 – gilamran