Вызов метода класса с помощью setInterval

246
04 декабря 2017, 18:47

Здравствуйте, вопрос у меня такой, ну изменять позицию экземпляра класса, есть метод Move, который изменяет позицию, хочу вызвать его с определённой задержкой в цикле

while (car1.currentPosition < screen.width - 10){
 div.style.left = car1.currentPosition + 'px';
 setInterval(car1.move(), 1000);
}

Car1 тестовый экземпляр, setInterval(car1.move(), 1000) - Данная конструкция не работает, вылетает всё разом без задержки. Вот и вопрос как изменить вызов setIntervalдля того чтобы всё работало

Answer 1

Для этого надо просто создать такую функцию, которая создает задержку...

Пример вот от сюда Источник

function sleep(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }
    while (car1.currentPosition < screen.width - 10) {
      div.style.left = car1.currentPosition + 'px';
       await sleep(2000);
      car1.move();
    }
Answer 2
while (car1.currentPosition < screen.width - 10){
 div.style.left = car1.currentPosition + 'px';
 setInterval(function(){car1.move()}, 1000);
}
Answer 3

Вам нужно прочитать про стек трейс и понять как работает javascript внутри движка. Метод while синхронный и будет выполняться пока не завершится в то время как setInterval асинхронный - он упадет в web APIs и будет ждать пока event loop его не вызовет (иными словами пока не пройдет весь стек трейс синхронных функций). Попробуйте использовать самовызывающиеся setTimeout (что-то типа этого):

setTimeout(function timeout() {
        if (car1.currentPosition < screen.width - 10) {
            div.style.left = car1.currentPosition + 'px';
            setTimeout(timeout, 1000);
        }
    }, 1000)
Answer 4

Необходимо убрать скобки. Вот так:

while (car1.currentPosition < screen.width - 10){
 div.style.left = car1.currentPosition + 'px';
 setInterval(car1.move, 1000);
}

UPDATE:

Тогда в вышем случае лучше так:

while (car1.currentPosition < screen.width - 10){
  div.style.left = car1.currentPosition + 'px';
  setTimeout(function call() {
    car1.move();
    setTimeout(call, 1000);
  }, 1000);
}

Данный код ждет, пока выполнется перемещение элемента.

READ ALSO
bitfinex api, multiple orders, rest api, JSON

bitfinex api, multiple orders, rest api, JSON

Пытаюсь создавать ордеры на bitfinex, через их REST APIВсе команды проходят нормально, только с Multiple New Orders (https://api

302
Зачем передавать window в качестве аргумента?

Зачем передавать window в качестве аргумента?

Например Google Analytics так делает: https://wwwgoogle-analytics

182
Форма отзывов Angular

Форма отзывов Angular

Приложение на angularНе удаётся получить значения из формы отзывов

234
Как правильно перевести массив из PHP в JavaScript?

Как правильно перевести массив из PHP в JavaScript?

ЗдравствуйтеПодскажите пожалуйста, как правильно перевести массив из php в js так, что бы внутри массива order создавались новые объекты, но при...

183