异步运行setTimeout()或setInterval()

时间:2014-11-25 17:38:43

标签: javascript synchronous

是否可以同步执行setTimeout()setInterval() ,以便依赖其回调的进一步执行不会导致not defined错误?

intv = window.setInterval(function() {

    // do some stuff
    doSomeStuff();

    // kill interval when stuff is done
    if (stuffIsDone)
        window.clearInterval(intv);
}, 10);

// dependent on "stuff" being done
// I want this to execute only after intv is cleared
doMoreStuff();

我不想将超时内的所有连续调用都检查if (typeof someStuff != 'undefined')

是的,我确实理解这会导致加载延迟并可能出现UI。间隔将非常小且无关紧要。

编辑... 好吧,我最终要做的是动态添加大量的javascript文件,只包含一个javascript文件。

即:

// auto include all javascript files
<script language="javascript" type="text/javascript" src="include.js"></script>

这可以通过AJAX从服务器请求JSON文件列表。它遍历列表并动态地将脚本添加到DOM中。

捕获:

如果我使用setInterval添加脚本,有时会在 onLoad事件触发后添加,具体取决于执行代码的计算机的当前计算负载。因此,当我从其中一个文件onLoad调用函数时,它会导致错误(因为在执行时,该函数不存在)

如果我在while循环内添加脚本,则动态添加的脚本不会执行,脚本之间的内部引用无效且出错。

所以,问题确实是:在每次调用时都不使用setIntervaltypeof ,如何可靠地动态添加脚本,以便相关代码不会尝试在加载依赖脚本之前执行?

2 个答案:

答案 0 :(得分:1)

请查看Refactoring setInterval-based Polling并考虑将setInterval转换为setTimeout,并在doMoreStuff()为真后使用承诺执行stuffIsDone

该文章来自2013年,因此请考虑使用Promises/A+(使用旧版浏览器的polyfill for ES6-style Promises代替jQuery或Underscore的实施。

答案 1 :(得分:-1)

如果要在一段固定的时间内阻止JavaScript线程,可以运行while循环并跟踪系统时间。

例如:

var startMillis = Date.now();
while (Date.now() - startMillis < 10);

请注意,在此期间不会运行其他代码。 JavaScript是单线程的。

不知道你到底想要做什么,但这看起来有点奇怪:)