Javascript的setTimeout函数让我重新评估我对javascript的了解。今天早些时候我遇到了像这样的for循环:
for (i = 0; i < length; i++) {
setTimeout(executeOtherCode, 5000)
}
我期望这段代码执行executeOtherCode函数,“sleep”5秒,然后继续下一次迭代。相反,我得到的是executeOtherCode同时执行长度时间。
因此,根据我的理解,setTimeout是一个异步函数调用。它是否正确?然而,如果我要执行一个常规函数,让我们称之为hugeFunction(),这需要花费1分钟来执行,下一行代码将不会执行,直到该函数返回一些东西,对吗?那两个为什么不同呢?只是语言设计的选择?
我见过jQuery中的其他函数,它们以类似的异步方式运行,比如getJSON。只是知道哪些函数被定义为异步,或者是否有某种模式来识别它们?如果是这样,什么?
答案 0 :(得分:6)
通常,除特殊情况外 - JavaScript会按顺序同步执行。
setTimeout(executeOtherCode, 5000)
告诉“在5秒内,运行函数executeOtherCode
”。它继续运行循环,它不会“阻止”执行。
在5秒内,事件循环会注意到一个计时器(好的,length
计时器)已经设置并将执行它们(一个接一个)。
如果希望函数在5秒内相互延迟执行,则需要告诉下一个函数在最后一个函数完成后5秒执行,这个模式称为异步信号量。
一般的经验法则是如果它执行I / O,它应该是异步的,这就是为什么AJAX是异步的(以及其他HTTP请求,如脚本标记注入)和交互事件是异步(JavaScript会对点击作出反应,例如,它不会等待它们)。定时器(setTimeout和setInterval也是异步的)。
其他一切都是同步的。
现在,某些功能可能使用这些其他功能,但there is no silver bullet找出哪个功能。只是清楚文档。大多数异步函数都有一个回调参数(比如executeOtherCode的第一个参数)但有些函数没有,有些函数接受回调但不是异步的。