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允许您获取第三部分函数,将其拆开,然后根据需要重新构建,然后覆盖原始函数。当然,这是更多的工作,但你可以做得很好。