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

Return value in a synchronous function after calling asynchronous function (setinterval) within it

本文关键字:函数 setinterval 返回值 异步 同步 调用      更新时间:2023-09-26

我正在Node.js上研究这个函数,具有以下要求:

  1. 尽可能保持代码流同步(以便易于阅读/遵循)
  2. 能够返回值,以便将其传递给更高级的函数。
  3. 如果必须使用异步函数,必须有某种方法来"阻塞"异步函数和返回语句之间的流,同时不阻塞程序和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模块/解决方案,如deasync,允许我维护这个代码结构(尽可能),并满足我的要求?

找到一个不使用本地Node.js模块(使用C/c++代码的模块,如deasync)的解决方案会更好,因为我可能需要在未来浏览程序。然而,我很高兴听到你的任何解决方案。谢谢!

基本上不可能在不阻塞的情况下"deasync"。

"异步"意味着结果将在稍后的时间产生。"同步"意味着代码执行将立即继续。这两者根本不相配。如果一个同步操作需要等待一个异步操作完成,它必须暂停操作,直到该操作完成;这意味着它将阻止

最友好的语法是使用Promises,而不会陷入回调的地狱。它们在某种程度上允许你编写看起来同步的代码,同时将异步回调的复杂性委托给后台。