在调用异步函数(setinterval)之后,在同步函数中返回值

时间:2015-08-05 14:17:07

标签: javascript node.js asynchronous return-value setinterval

我正在使用Node.js上的这个函数,具有以下要求:

  1. 尽可能保持同步代码流(以便于阅读/遵循)
  2. 能够返回值,以便可以将其传递给更高级别的函数。
  3. 如果必须使用异步函数,必须有一些方法来“阻塞”异步函数和return语句之间的流程,同时不阻塞程序和GUI。
  4. 这是我的代码:

    main.js

    var some = require("./some.js");
    
    main_fn = function () {
        var result = some.some_fn();
        if (result == "good") // do something
    };
    
    main_fn();
    

    some.js

    exports.some_fn = function () {
        var result;
        var someInterval = setInterval(function () {
            // output to GUI
            if (condition1) {
                clearInterval(someInterval);
                result = "good";
            } else if (condition2) {
                clearInterval(someInterval);
                result = "bad";
            }
            // else continue with interval
        }, 250);
    
        // previous way: deasync
        // it will not block event loop, however it will block the GUI ("freeze" the browser)
        // require("deasync").loopWhile(function () { return result === undefined; });
    
        // result will be undefined here if no code to "block" in between
        // but I need result to be either "good" or "bad"
        return result;
    };
    

    从代码中可以看出,我尝试过deasync(https://github.com/abbr/deasync)。但是,这将阻止GUI。是否有任何Node.js模块/解决方法,比如deasync,允许我维护这个代码结构(尽可能)并满足我的要求?

    在不使用本机Node.js模块(使用C / C ++代码的模块,如deasync)的情况下找到解决方案会更好,因为我可能需要在将来对程序进行浏览。但是,我很高兴听到你的任何解决方案。谢谢!

1 个答案:

答案 0 :(得分:0)

根本不可能在没有阻止的情况下“取消同步”。

“异步”表示结果将在稍后的某个时间生成 。 “同步”意味着代码执行将立即继续。这两个根本不在一起。如果同步操作需要等待异步操作的完成,则必须暂停操作,直到操作完成为止;这意味着它将阻止

最友好的语法没有转入回调地狱就是使用Promises。它们允许您编写同步代码,同时将异步回调的复杂性委托给后台。