【发布时间】:2013-06-22 02:56:54
【问题描述】:
Javascript 的 setTimeout 函数让我重新评估我对 javascript 的了解。今天早些时候,我遇到了这样的 for 循环:
for (i = 0; i < length; i++) {
setTimeout(executeOtherCode, 5000)
}
我希望这段代码执行的操作是执行 executeOtherCode 函数,“休眠”5 秒,然后继续下一次迭代。相反,我得到的是同时执行长度时间的 executeOtherCode。
所以据我了解,setTimeout 是一个异步函数调用。它是否正确?然而,如果我要执行一个常规函数,我们称之为 hugeFunction(),它需要 1 分钟才能执行,下一行代码在该函数返回之前不会执行,对吗?那么为什么两者不同呢?只是语言设计的选择?
我在 jQuery 中看到过以类似异步方式运行的其他函数,例如 getJSON。仅仅是知道哪些函数被定义为异步的问题,还是有某种模式可以识别它们?如果是这样,是什么?
【问题讨论】:
-
通常异步函数是处理通过网络检索数据或某种 I/O 操作的函数(例如,HTML5 的新 IndexedDB 和 WebWorkers 特性中的一些方法)。除此之外,没有真正一致的方式来识别它们。您只需查看您正在使用的库的文档即可。
-
“我得到的是同时执行OtherCode” - 不,你没有。该代码排队
executeOtherCode()以在 5000 毫秒后调用length次,同时当前块继续。每次超时都会尽可能晚地接近 5000 毫秒但不是在其他 JS 已经在执行时,所以每个超时都一个接一个地执行,而不是同时执行,而不是多线程。它只是似乎同时发生,因为两者之间没有明显的延迟。
标签: javascript jquery