Почему я не могу написать такой асинхронный код на JavaScript? - PullRequest
0 голосов
/ 23 мая 2019

Я хочу выполнить JavaScript несколько раз, пока не получу ответ от сервера. В этой упрощенной версии задачи я хочу "Out!" вывод на консоль при возврате ответа и после прекращения выполнения myFunction, но по какой-то причине цикл while никогда не прерывается, а переменная out никогда не устанавливается в true. Что я тут не так делаю?

let keepGoing = true;   
let out = false;


function myFunction() {
    if (keepGoing) {
        console.log('Still going!');
        setTimeout(myFunction, 100);
    }
    else {
        out = true;
    }
}

setTimeout(myFunction, 100);

fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then((response) => {
       keepGoing = false;
       while (!out);
       console.log('Out!');
    });

1 Ответ

2 голосов
/ 23 мая 2019

JavaScript - это однопоточный язык.Это означает, что одновременно может быть выполнен только один оператор.Когда у вас есть что-то вроде while (!out);, этот по необходимости заблокирует все выполнение и никогда не перейдет к следующему оператору.

Обратные вызовы и обещания являются решениями этой проблемы, которые допускают разные частикод должен выполняться не по порядку, но все же базовый движок является однопоточным.Поэтому, когда вы говорите,

, я также хочу убедиться, что myFunction завершил выполнение.

Вы должны понимать, что для любой другой части кода нет способавыполнить, если myFunction в данный момент выполняется.Подумайте об этом с другой стороны: вместо этого вам нужно убедиться, что myFunction не выполняется после получения ответа.

Вот альтернативное решение:

function myFunction() {
  console.log('Still going!');
}

const intervalId = setInterval(myFunction, 100);

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then((response) => {
    clearInterval(intervalId);
    console.log('Out!');
  });

Как это работает: myFunction будет выполняться каждые ~ 100 мс, пока ответ не будет возвращен в then, после чего интервал будет отменен (он выигралне будет выполнено в следующие 100 мс интервал), и Out! будет зарегистрировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...