这个例子中的fn是什么?

时间:2011-06-22 09:16:43

标签: javascript testing node.js

在这个例子中,有一个带有null和false参数的fn函数:

io.configure(function () {
  function auth (data, fn) {
    fn(null, false);
  };

  io.set('authorization', auth);
});

https://github.com/LearnBoost/Socket.IO-node/blob/master/test/manager.test.js#L400-403

什么是fn以及它做了什么?

它只是意味着,示例函数,在这里粘贴你自己的函数,还是它意味着什么呢?

2 个答案:

答案 0 :(得分:3)

在此示例中,fn是一个作为参数传递给auth()的函数,所以是的,您为auth()提供了一些您自己选择的功能。这称为“高阶函数”,有关简短介绍,请参阅here。这是一种主要与functional programming相关联的技术,并且由于Javascript的面向对象通常被认为有点弱,因此Javascript中的高级程序往往会出现(Javascript有时被称为“Scheme in Java's clothing “)

在这个确切的代码中:它是测试套件的一部分,因此它将io配置为总是失败授权,以便看到授权失败得到优雅处理(目前408-409行):< / p>

res.statusCode.should.eql(403);
data.should.match(/handshake unauthorized/);

应该无异常地到达这些行,并且测试会检查结果是否包含有意义的值。

答案 1 :(得分:0)

fn是作为参数传递给auth的函数。

auth函数is called here

Manager.prototype.authorize = function (data, fn) {
  if (this.get('authorization')) {
    var self = this;

    this.get('authorization').call(this, data, function (err, authorized) {
      self.log.debug('client ' + authorized ? 'authorized' : 'unauthorized');
      fn(err, authorized);
    });
  } else {
    this.log.debug('client authorized');
    fn(null, true);
  }

  return this;
};

因此,您会看到回调函数接受两个参数errauthorized。在测试中,这些参数设置为nullfalse

很可能在某些时候你可以指定fn应该是什么,但这不一定是!也可能是这个函数总是由库提供,在设置auth函数时调用它是你的工作。