【发布时间】:2013-02-17 15:18:33
【问题描述】:
假设我有这两个功能:
function complex() {
setTimeout(function() {
console.log('complex setTimeout');
}, 1000); // assume this value is random
function subFun() {
console.log('complex subFun');
setTimeout(function() {
console.log('complex subFunction setTimeout');
}, 2000); // assume this value is random
}
subFun();
}
function simple() {
console.log('simple');
}
假设它们不是我写的——它们是第三方。现在我想同步调用它们并获取:
complex subFun
complex setTimeout
complex subFunction setTimeout
simple
问题是,我不能使用回调(第三方函数)。我也不能使用承诺或事件(同样的原因)。我不能使用async 和step 模块,因为功能很丰富。我怎么能在complex()(以及所有嵌套的子函数)之后同步调用simple()? JavaScript sux 呢? :)
【问题讨论】:
-
第三方与否,你必须摆脱每个
setTimeout才能做到这一点。 -
setTimeout 只是为了模拟我不知道这个函数(和嵌套函数)会执行多长时间的情况。这是很常见的情况。
-
好吧...除了 JS 中链接函数的回调之外,我没有看到任何其他方法。
-
所以问题是 - 为什么?为什么 JS 设计者不希望/不能用
blocking关键字来扩展这种语言?大多数阻塞语言都提供了一些语法来创建非阻塞函数,为什么 JS 不能做到呢? -
因为如果你屏蔽了JS,你就屏蔽了整个浏览器进程。 JS 不是多线程的,回调被编织到单线程的执行中。而且您总是可以使用回调,因为 JS 允许您获取该第三方函数,将其拆开,然后根据需要重新构建它,然后覆盖原始函数。当然,这是更多的工作,但你可以做得很好。
标签: javascript function blocking synchronous serial-processing