Добавление таймаута в цикл - PullRequest
0 голосов
/ 25 октября 2018

У меня есть функция, которая выполнит действие, когда таймер достигнет 5000 мс:

         var timer = new Timer(function () {
            console.log("refreshingBid");
            refreshBid();
        }, 5000);

        timer.pause();
        if (isElementInViewport() === true) {
            console.log("element in view");
            timer.resume();
        } else {
            timer.pause();
            console.log("element is out of view")
        }

//I am trying to loop this 5 times with the 5000ms delay - the code I am using for this is:

    for (i=0;i<=5;i++)
    {
    MyFunc();
    }

Кажется, независимо от того, помещаю ли я цикл for в таймер или я помещаю таймер в цикл for, результат одинаков, когда вместо этого все 5 циклов происходят мгновеннос задержкой применяемого таймера?Я не уверен, что я делаю не так здесь ... Любая помощь будет признательна!

Извините, отредактируйте, чтобы включить полный код ниже:

<script>
    var iframe2 = document.getElementById('postbid_if');
    function isElementInViewport() {
        var el = document.getElementById('postbid_if')
        console.log(el)
        var rect = el.getBoundingClientRect();
        console.log(rect)

        return rect.bottom >= 0 &&
            rect.right >= 0 &&
            rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
            rect.top < (window.innerHeight || document.documentElement.clientHeight);
    }

    function Timer(callback, delay) {
        var timerId, start, remaining = delay;

        this.pause = function () {
            window.clearTimeout(timerId);
            remaining -= new Date() - start;
        };

        this.resume = function () {
            start = new Date();
            window.clearTimeout(timerId);
            timerId = window.setTimeout(callback, remaining);
        };

        this.resume();
    }

    for (i = 0; i <= 5; i++) {
        MyFunc();
    }

    var timer = new Timer(function () {
        console.log("refreshingBid");
        refreshBid();
    }, 5000);

    timer.pause();
    if (isElementInViewport() === true) {
        console.log("element in view");
        timer.resume();
    } else {
        timer.pause();
        console.log("element is out of view")
    }

</script>

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Это потому, что он проходит 5 раз быстро, тогда все 5 циклов задерживаются через 5 секунд.Время ожидания приостанавливается через 5 секунд, а не на 5 секунд впереди.

0 голосов
/ 25 октября 2018

Возможно, вы могли бы пересмотреть свой код таким образом, чтобы выполнить итерации на основе таймера при необходимости:

//Track the current iteration
var i = 0;

function MyFunc() {      

    var timer = new Timer(function () {
        console.log("refreshingBid");
        refreshBid();

        // The current timer has completed. If the current 
        // iteration is less than 5...
        if(i < 5) {

          i++;

          // .. then start another timer for the next iteration
          MyFunc();
        }
    }, 5000);

    timer.pause();
    if (isElementInViewport() === true) {
        console.log("element in view");
        timer.resume();
    } else {
        timer.pause();
        console.log("element is out of view")
    }

}

// Start the first iteration
MyFunc();
...