我想重复执行一些 JavaScript,直到我得到服务器的响应。在这个问题的简化版本中,我想要“出局!” 在返回响应时和 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!');
});
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!
记录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句