有人可以帮我理解这部分代码:
var auth = function(cb) {
return _.wrap(cb, function(fn, data) {
redis.get(email, function(err, id){
if (!err) throw err;
if (!id) return socket.disconnect('unauthorized');
fn(data);
});
});
};
我是从article获得的。
我不明白那里发生了什么,即使我导航到lodash文档并阅读'wrap'方法。我很困惑,特别是因为我无法看到文章中的'auth'被进一步使用! (我认为这被定义为毕竟用于某处)。 提前谢谢。
答案 0 :(得分:1)
所以,让我们打破它。首先,我们正在分配一个将cb
参数带到auth
的函数。该函数做了什么,它返回_.wrap
的结果。查看文档,_.wrap
是一个currying函数,因此它需要一个arg(cb
)和一个函数,并返回一个新函数,其中第一个参数绑定到arg,其余部分参数未绑定。事实上,_.wrap
部分:
return _.wrap(cb, function(fn, data) {
/* code */
fn(data); // inside of the redis scope
})
可能有点矫枉过正,因为你处于外部函数的闭包中,所以你可以这样做:
return function(data) {
/* code */
cb(data) // in the redis callbak scope, but that is still in the closed over scope
}
老实说,我不确定他们为什么不这样做(锤子/钉子?)。
让我们继续。
因此,我们确定auth
是一个函数,它接受cb
参数并返回一个带data
参数的函数。该函数现在调用redis.get
来查找与email
中存储的密钥相关联的值(从周围范围拉入)。然后它调用传入的回调函数(采用err和id的函数)验证参数(如果电子邮件没有在redis中关联,则断开websocket,最后使用传入的cb
回调调用原始data
回调。 {1}}参数。
我不确定它在代码中的用途,但我们的想法是你可以把它称为:
let authCb = auth((data) => { console.log(data) })
authCb('test')
如果在redis中找到电子邮件,则应将test
记录到控制台。在本文的上下文中,您将在实际开始与套接字通信之前使用它来验证连接(在cb
函数中)