【问题标题】:Synchronous functions without callbacks没有回调的同步函数
【发布时间】: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

问题是,我不能使用回调(第三方函数)。我也不能使用承诺或事件(同样的原因)。我不能使用asyncstep 模块,因为功能很丰富。我怎么能在complex()(以及所有嵌套的子函数)之后同步调用simple()? JavaScript sux 呢? :)

【问题讨论】:

  • 第三方与否,你必须摆脱每个setTimeout 才能做到这一点。
  • setTimeout 只是为了模拟我不知道这个函数(和嵌套函数)会执行多长时间的情况。这是很常见的情况。
  • 好吧...除了 JS 中链接函数的回调之外,我没有看到任何其他方法。
  • 所以问题是 - 为什么?为什么 JS 设计者不希望/不能用 blocking 关键字来扩展这种语言?大多数阻塞语言都提供了一些语法来创建非阻塞函数,为什么 JS 不能做到呢?
  • 因为如果你屏蔽了JS,你就屏蔽了整个浏览器进程。 JS 不是多线程的,回调被编织到单线程的执行中。而且您总是可以使用回调,因为 JS 允许您获取该第三方函数,将其拆开,然后根据需要重新构建它,然后覆盖原始函数。当然,这是更多的工作,但你可以做得很好。

标签: javascript function blocking synchronous serial-processing


【解决方案1】:

我怎么能在[异步事物]同步之后调用 simple()?

你不能。这就是异步 vs 同步的定义。

如果你有没有反馈的异步脚本,你只有两个选择:

  • 通过setInterval或类似方式轮询脚本的结果,并在检测到已到达后执行simple()
  • 将第三方替换为更好的第三方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2019-07-06
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多