Basi c JavaScript пока l oop не завершается, как ожидалось - PullRequest
0 голосов
/ 13 февраля 2020

В моей программе 2 JS файлов, и один вызывает функцию в другом файле и передает ей два аргумента. Никаких проблем - l oop во 2-м файле работает как положено - пока не завершится. Я делаю нечто подобное в другой части моего приложения без каких-либо проблем.

Код из файла 1 (этот l oop вызывается из события на странице - он возвращает функцию, поэтому я могу включить аргументы без вызова функции):

let loopStat = false;

let j = 0;

const sleep = (milliseconds) => {
    return new Promise(resolve => setInterval(resolve, milliseconds))
  }

const callLoop = (item) => {
    
        return function() {
            loopStat = !loopStat;
    
            loopFunc(loopStat, item);
        }
    }

const loopFunc = async (z, item) => {

        console.log('before loop', z);

        while (z == true) {
            
            console.log('inside loop', z);
  
            j++;
            
            console.log(j);

            await sleep(1000);
        }
     }
     
var button = document.getElementById('button')
button.addEventListener("click", callLoop(button));
<div id="parent">
  <button id="button">Loop</button>
</div>

Очевидно, "z" используется для завершения l oop в этой функции. Я включил биты console.log, чтобы показать, что такое z в разных точках. При повторном нажатии кнопки она переключает переменную loopStat в значение false, снова вызывает функцию и отправляет этот аргумент. Странно то, что новый аргумент отправляется функции (как показано в 'before l oop' console.log), но внутри l oop он меняет "z" обратно на true, как показано на "inside l oop" console.log.

Я также думаю, что стоит упомянуть, что переменные "z" и "loopStat" больше нигде в приложении не используются.

I Я ожидаю, что решение будет чем-то очевидным, и я подозреваю, что это проблема масштаба.

1 Ответ

0 голосов
/ 13 февраля 2020

Полагаю, я могу ответить на свой вопрос, поскольку никто другой не получил его.

Оказывается, переменная, используемая в качестве условия для l oop, должна быть ЗАЯВЛЕНА вне области видимости. l oop и даже вне функции, содержащей его.

var condition = false;

const callLoop = (z) => {

    //If this variable is going to be the condition for the loop, it has to
    //be declared outside of the function containing the loop.  You can't
    //just pass the argument containing the value as the condition.  
    //Obviously, you could also just use "x" as the condition, in this case. 
    condition = z;
    var j = 0;

    while (condition === true) {
        j++;
    }
}

var x = false;
const toggleLoop = () => {
    x = !x;
    callLoop(x);
}
...