如何从异步函数创建同步函数以实现向后兼容性

时间:2015-01-26 12:54:54

标签: javascript node.js express

  

免责声明:我知道应该避免使用同步,并且承诺和回调是首选的,但是我很难编写一个需要少量向后兼容性的系统,并且需要将其写入临时停止差距

编写一个express.js应用程序,我有一个函数从.get或.post等函数获取请求对象,并确认会话密钥是否有效(在使用远程API服务器检查后)。该函数的主要版本是这样的:

module.exports.isValidSession(req, cb) {
    // REST API Calls and callbacks, error handling etc, all works fine.
}

我需要上面的一个版本与旧系统兼容(很快就会淘汰)。我对Node很新,虽然不是JS,所以我想知道如何做一个很好的约定?

其他信息

我遇到的主要问题是从某种“观察者”中返回一个同步函数 - 请参阅下面我考虑的一种方法,这种方法不起作用,但我想也许有人知道一种方法。 (它必须轮询变量的值,直到异步函数设置它以表明它已完成。)

function isValidSession(req) {

    var running = 1, ret = -1;

    var looper = setInterval(function () {

        if (!running) {
            clearInterval(looper);
            return ret; // This is the problem bit.  Returns an async interval function, not the parent.
        }

    }, 500);

    request(requestOpts, function (error, response, body) {

        if (error) {
            ret = new Error('Some error went on');
            running = -1;
        }

        if (response.statusCode === 200) {
            ret = true;
            running = -1;
        }

    });

}

可能不可能,或者更有可能,不可行,但如果我可以将这个包括在一个星期左右的后退compat中,那将非常有用。这是一个开发项目atm,所以如果它不是一个好的练习,只要它不会压缩一切,它就会这样做。但我确实认识到它基本上与Node的整个观点相悖(尽管Node本身包括同步和异步版本中可用的几个函数)。

感谢所有的帮助。

1 个答案:

答案 0 :(得分:0)

让我们假装有一个强烈的理由让作者想要这个。

有一个名为synchronize.js

的相当受欢迎的模块(因此,您并不孤单)

用例:

  1. 将回调添加到isValidSession

    function isValidSession(req, cb) {
    
    request(requestOpts, function (error, response, body) {
    
        if (error) {
            cb(new Error('Some error went on'));
        }
    
        if (response.statusCode === 200) {
            cb(null, true);
        }
    });
    
    }
    
  2. 将其与sync模块一起使用:

    var ret = sync.await(isValidSession(req, sync.defer()))

  3. P.S。可能需要测试,请参阅documentation