我正在Node.js上使用此功能,具有以下要求:


尽可能保持同步代码流(以便易于阅读/关注)
能够返回值,以便可以将其传递给更高级别的函数。
如果必须使用异步函数,则必须有某种方式可以“阻止”异步函数和return语句之间的流,而同时又不要阻止程序和GUI。


这是我的代码:

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模块/解决方法(例如非同步),可以让我(尽可能)维护此代码结构并满足我的最高要求?

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

最佳答案

从根本上讲,不阻塞就不可能“解除同步”。

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

不承诺进入回调地狱的最友好的语法是使用Promises。它们使您可以编写看起来像同步的代码,同时将异步回调的复杂性委派给后台。

关于javascript - 在其中调用异步函数(setinterval)后,返回同步函数中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31835121/

10-16 23:25