免责声明:我知道应该避免使用同步,并且承诺和回调是首选的,但是我很难编写一个需要少量向后兼容性的系统,并且需要将其写入临时停止差距
编写一个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本身包括同步和异步版本中可用的几个函数)。
感谢所有的帮助。
答案 0 :(得分:0)
让我们假装有一个强烈的理由让作者想要这个。
有一个名为synchronize.js
的相当受欢迎的模块(因此,您并不孤单)用例:
将回调添加到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);
}
});
}
将其与sync
模块一起使用:
var ret = sync.await(isValidSession(req, sync.defer()))
P.S。可能需要测试,请参阅documentation。