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