Javascript 无回调的同步函数
假设我有以下两个功能:Javascript 无回调的同步函数,javascript,function,blocking,synchronous,serial-processing,Javascript,Function,Blocking,Synchronous,Serial Processing,假设我有以下两个功能: function complex() { setTimeout(function() { console.log('complex setTimeout'); }, 1000); // assume this value is random function subFun() { console.log('complex subFun');
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吗?:)
我怎么能在[async things]之后同步调用simple()
你不能。这就是异步与同步的定义
如果您有没有反馈的异步脚本,您只有两个选择:
- 通过
或类似工具轮询脚本结果,并在检测到已到达后执行setInterval
simple()
- 用更好的第三方代替那个第三方
setTimeout
才能做到这一点。setTimeout只是为了模拟我不知道此函数(和嵌套函数)将执行多长时间的情况。这是非常常见的情况。好吧……除了在JS中调用链接函数外,我看不到任何其他方法。所以问题是-为什么?为什么JS设计人员不想/不能用阻塞
关键字之类的东西来扩展这种语言?大多数阻塞语言提供了一些语法来创建非阻塞函数,为什么JS不能这样做呢?因为如果你阻塞JS,你就阻塞了整个浏览器进程。JS不是多线程的,回调被编织到单个线程的执行中。您可以随时使用回调,因为JS允许您获取第三部分函数,将其拆开,然后根据需要重新构建,然后覆盖原始函数。当然,这是更多的工作,但你可以做得很好。