gpt4 book ai didi

javascript - 为什么我不能在 JavaScript 中编写这样的异步代码?

转载 作者:行者123 更新时间:2023-12-01 00:58:59 25 4
gpt4 key购买 nike

我想重复执行一些 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!');
});

最佳答案

JavaScript 是一种单线程语言。这意味着一次只能执行一个语句。当你有像 while (!out); 这样的东西时,这个必然将阻止所有执行,并且永远不会继续到下一个语句。

回调和 promise 是这个问题的解决方案,允许不按顺序执行代码的不同部分,但底层引擎仍然是单线程的。所以当你说,

I also want to ensure that myFunction has finished executing.

您需要了解,如果 myFunction 当前正在执行,则代码的任何其他部分都无法执行。从另一个 Angular 思考这个问题:您想要的是确保 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!

关于javascript - 为什么我不能在 JavaScript 中编写这样的异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56280840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com