gpt4 book ai didi

javascript - 通过 JS 的 setTimeout 理解线程/同步

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:25:52 24 4
gpt4 key购买 nike

Javascript 的 setTimeout 函数让我重新评估我对 javascript 的了解。今天早些时候,我遇到了这样的 for 循环:

for (i = 0; i < length; i++) {
setTimeout(executeOtherCode, 5000)
}

我希望这段代码执行 executeOtherCode 函数,“休眠”5 秒,然后继续下一次迭代。相反,我得到的是同时执行 length 次的 executeOtherCode。

所以根据我的理解,setTimeout是一个异步函数调用。它是否正确?然而,如果我要执行一个常规函数,我们称它为 hugeFunction(),执行需要 1 分钟,下一行代码将在该函数返回某些内容之前执行,对吗?那么为什么两者不同呢?只是一个语言设计选择?

我已经看到 jQuery 中的其他函数以类似的异步方式运行,例如 getJSON。仅仅是知道哪些函数被定义为异步的问题,还是有某种模式来识别它们?如果是这样,什么?

最佳答案

一般情况下,除了特殊情况 - JavaScript 同步并按顺序执行。

setTimeout(executeOtherCode, 5000)

告诉“在 5 秒内,运行函数 executeOtherCode”。它会继续运行循环,不会“阻止”执行。

在 5 秒内,事件循环将注意到一个计时器(好吧,length 计时器)已设置并将执行它们(一个接一个)。

如果您希望函数之间的执行时间延迟 5 秒,则需要告诉下一个函数在上一个函数完成后 5 秒执行,这种模式称为异步信号量。

一般的经验法则是如果它做 I/O,它应该是异步的,这就是为什么 AJAX 是异步的(以及其他 HTTP 请求,如脚本标记注入(inject))并且交互事件是异步的异步(例如,JavaScript 对点击使用react,它不会等待点击)。计时器(setTimeout 和 setInterval 也是异步的)。

其他一切都是同步的。

现在,某些功能可能使用这些其他功能,但there is no silver bullet在找出哪个是哪个。只是清除文档。大多数异步函数都有回调参数(如 executeOtherCode 的第一个参数),但有些没有,有些函数接受回调但不是异步的。

关于javascript - 通过 JS 的 setTimeout 理解线程/同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17246913/

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