【问题标题】:What is fn in this example?这个例子中的 fn 是什么?
【发布时间】:2011-06-22 09:16:42
【问题描述】:

在这个例子中,有一个带有 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,它有什么作用?

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

【问题讨论】:

  • 总是添加有问题的代码。

标签: javascript testing node.js


【解决方案1】:

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

在这个确切的代码中:它是测试套件的一部分,因此它将io 配置为始终失败授权,以便看到授权失败得到妥善处理(目前为第 408-409 行):

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

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

【讨论】:

  • 我会说JS面向对象很强大,只是不同而已。
  • 我认为它也很好,但不太容易获得(如果你想要传统的继承,你必须自己提供它),因此更普遍地使用函数式习语。
【解决方案2】:

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 函数时调用它是你的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多