如何正确使用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
。
您在此处缺少基本信息。这是JavaScript事件循环的!
你不能使用do while
因为它会永远(曾经)结束,将挂起你的应用程序,如日志表示。
它也看起来像你不等待承诺解决..承诺提供的then
方法只是一个可能/将来会发生的功能。你的do/while
挂起的应用程序,所以它不能解决这个承诺...
我会建议尝试异步/等待,因为它提供了一个类似的语法,你期望摆脱JavaScript。
谢谢。你能帮助我吗?我读了异步/等待,但我不知道如何修改'do while'逻辑异步/等待。 – user1692261
我不确定你试图达到的逻辑是什么......我最好打开一个关于如何将代码转换为异步/等待的新问题 – gilamran
我明白当前代码会发生什么。问题是如何修改它,以便do-while逻辑只有在所有10次调用'forceFixLocation'后才会执行。 – user1692261
提取做 - 而逻辑分成单独的功能,并从forceFixLocation调用它。 – Nosyara