Ждите внутри интервала JavaScript - PullRequest
2 голосов
/ 25 января 2020

В настоящее время я пытаюсь настроить тайм-аут для устройства. Моя первоначальная мысль - создать тайм-аут на 15 минут, затем каждую минуту иметь интервал, запрашивать местоположение устройства и сравнивать его с предыдущим местоположением устройства. Если местоположение превышает некоторый порог, сбросьте 15-минутный таймер. Если местоположение не превышает пороговое значение, то время ожидания продолжается до истечения 15 минут, и я запускаю какой-то другой код.

Моя проблема в том, что я не могу дождаться, чтобы получить новое местоположение в стороне от интервала

timeoutFunc(minutes) {
    return setTimeout(function () {
        console.log("lock device")
    }, minutes * 1000)
}

async rideTimer(minutes) {
    let coords = this.location

    this.timeOut = timeoutFunc(minutes)         // init timeout func
    let interval = setInterval(function () {
        console.log(coords)
        let newLocation = await getLocation()   // get location 
        console.log(this.location)           

        // check if location changed
        if (Math.abs(this.location[0] - coords[0]) > 0.001 || Math.abs(this.location[1] - coords[1]) > 0.001) { 
            // location did change
            clearTimeout(this.timer)            // clear timeout
            this.timeOut = timeoutFunc(minutes) // reinitialize timeout
        }// else do nothing
    }, 1000)
}

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Если вам нужна какая-то sleep функция, вы должны делать это с обещаниями и асин c await, вот фиктивный код:

  sleep(milliseconds) {
     return new Promise((resolve, reject) => {
        setTimeout(()=>{
           resolve();
        },milliseconds);
     })
  }

   async someFunc(){
      setInterval(()=>{
         await sleep(4000);
         console.log("work");
      })
   }
0 голосов
/ 25 января 2020

await можно использовать только с асинхронными функциями c.

И с асинхронными c функциями можно использовать таймеры:

function dummyGetData() {
  return new Promise(resolve => setTimeout(()=>resolve(new Date), 20));
}

const timer_end = Date.now() + 5000;
let timer = setInterval( async ()=> {
  const data = await dummyGetData();
  console.log(data);
  if (timer_end < Date.now()) clearInterval(timer);
},1000)
...