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

用户11546437

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

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在javascript中我不能在这个函数中创建对象?

来自分类Dev

为什么我不能在JSFiddle中执行这个简单的JavaScript测试程序?

来自分类Javascript

为什么我不能在javascript中向字符串对象添加属性?

来自分类Dev

为什么我不能在方法中引用从JavaScript原型继承的方法

来自分类Dev

为什么我不能在 Javascript 中访问这个对象的元素?

来自分类Dev

为什么我不能在JavaScript中解析此json字符串?

来自分类Dev

为什么我在If语句中设置的变量不能在javascript中的if语句之外起作用?

来自分类Dev

为什么我不能在异步方法中调试代码?

来自分类Dev

为什么不能在JavaScript中设置导航栏的高度?

来自分类Dev

为什么不能在javascript中设置内置对象的原型?

来自分类Dev

为什么 javascript 'For' 语句不能在数组中工作?

来自分类Dev

为什么我的正则表达式可以在PHP中工作,但不能在JavaScript中工作?

来自分类Java

为什么我不能在Java中传递这样的数组

来自分类Dev

为什么我不能在 Flutter 中编写 sematicLabel

来自分类Dev

为什么我不能在代码中删除中间变量?

来自分类Dev

为什么我不能在代码中删除“ checkSelfPermission”?

来自分类Dev

为什么我不能在代码中输入设置?

来自分类Dev

为什么我的函数不能在 python 代码中执行?

来自分类Dev

为什么我不能在JavaScript中进行array [-1]?

来自分类Dev

为什么我不能在我的代码中使用“ balance ”?

来自分类Dev

VS Code中的JavaScript:为什么不能在“ switch”语句中折叠“ case”代码块?

来自分类Dev

为什么我不能在 Flatlist 中显示我的项目?

来自分类Dev

为什么我不能在 init 中获得我的 fetchedResults?

来自分类Dev

为什么我们不能在javascript中修改字符串长度,因为我们可以修改数组的长度?

来自分类Dev

为什么我不能在JavaScript中的4个变量之间做加法运算,但我却可以用3个变量进行加法运算?

来自分类Dev

为什么我不能在 chartjs 图表中更新宽高比?

来自分类Dev

为什么我不能在 html 中全屏显示图像?

来自分类Dev

为什么我不能在 css 中对图像进行过渡?

来自分类Dev

ElasticSearch:为什么我不能在特定类型中搜索?

Related 相关文章

  1. 1

    为什么在javascript中我不能在这个函数中创建对象?

  2. 2

    为什么我不能在JSFiddle中执行这个简单的JavaScript测试程序?

  3. 3

    为什么我不能在javascript中向字符串对象添加属性?

  4. 4

    为什么我不能在方法中引用从JavaScript原型继承的方法

  5. 5

    为什么我不能在 Javascript 中访问这个对象的元素?

  6. 6

    为什么我不能在JavaScript中解析此json字符串?

  7. 7

    为什么我在If语句中设置的变量不能在javascript中的if语句之外起作用?

  8. 8

    为什么我不能在异步方法中调试代码?

  9. 9

    为什么不能在JavaScript中设置导航栏的高度?

  10. 10

    为什么不能在javascript中设置内置对象的原型?

  11. 11

    为什么 javascript 'For' 语句不能在数组中工作?

  12. 12

    为什么我的正则表达式可以在PHP中工作,但不能在JavaScript中工作?

  13. 13

    为什么我不能在Java中传递这样的数组

  14. 14

    为什么我不能在 Flutter 中编写 sematicLabel

  15. 15

    为什么我不能在代码中删除中间变量?

  16. 16

    为什么我不能在代码中删除“ checkSelfPermission”?

  17. 17

    为什么我不能在代码中输入设置?

  18. 18

    为什么我的函数不能在 python 代码中执行?

  19. 19

    为什么我不能在JavaScript中进行array [-1]?

  20. 20

    为什么我不能在我的代码中使用“ balance ”?

  21. 21

    VS Code中的JavaScript:为什么不能在“ switch”语句中折叠“ case”代码块?

  22. 22

    为什么我不能在 Flatlist 中显示我的项目?

  23. 23

    为什么我不能在 init 中获得我的 fetchedResults?

  24. 24

    为什么我们不能在javascript中修改字符串长度,因为我们可以修改数组的长度?

  25. 25

    为什么我不能在JavaScript中的4个变量之间做加法运算,但我却可以用3个变量进行加法运算?

  26. 26

    为什么我不能在 chartjs 图表中更新宽高比?

  27. 27

    为什么我不能在 html 中全屏显示图像?

  28. 28

    为什么我不能在 css 中对图像进行过渡?

  29. 29

    ElasticSearch:为什么我不能在特定类型中搜索?

热门标签

归档