首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用SetTimeout (打字)

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

Stack Overflow用户
提问于 2017-08-15 06:20:52
回答 2查看 539关注 0票数 0

我正在开发一个使用Geolocation的ionic-cordova应用程序。

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

我编写了专用的方法来实现定位,并在其中使用了setTimeout

根据我的日志,我似乎没有正确使用setTimeout --或者更糟糕的是,我选择得很糟糕,setTimeout不是我在这里需要的。

这是我的代码:

代码语言:javascript
复制
  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的第一次迭代之前执行的

代码语言:javascript
复制
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)

这里的正确方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2017-08-15 06:33:08

forceFixLocation内部的lambda函数将在3秒后第一次调用。当您从getFixedLocation调用this.forceFixLocation(10);时-它立即继续执行下一行并执行while逻辑。更重要的是,getFixedLocation可能已经返回了一些值,但您仍然会每隔3秒(10次)调用一次forceFixLocation

票数 0
EN

Stack Overflow用户

发布于 2017-08-15 06:38:47

您在这里遗漏了一个基本信息。这是JavaScript事件循环!

您不能使用do while,因为它永远不会结束,并且会挂起您的应用程序,正如日志所指示的那样。

看起来你不是在等待承诺来解决..promise提供的then方法只是一个将来可能/将会发生的函数。您的do/while挂起了应用程序,因此它无法解析此承诺...

我建议尝试异步/等待,因为它提供了与您期望从JavaScript获得的语法相似的语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45683871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档