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!
будет зарегистрировано.