Coffeescript回调作用域问题

3

你好,我正在尝试为hubot编写插件脚本。但是,我似乎有一个作用域问题。fork回调函数中的"msg"引用未定义,我似乎在回调函数中没有获取到任何变量。

我也遇到了与内置的jira-issues.coffee相同的问题!昨天在那个脚本中,回调函数中的jiraUrl未定义。今天早上它又恢复正常了,但现在它又停止工作了(在我重启hubot之后)。我甚至从未修改过它。

有人经历过类似的情况吗?

githubApi = require("node-github")

module.exports = (robot) ->
  github = new githubApi { "version": "3.0.0" }
  github.authenticate { "type":"basic", "username":process.env.HUBOT_GITHUB_USER, "password":process.env.HUBOT_GITHUB_P
ASSWORD }
  robot.respond /kickstart\s(\S+)/i, (msg) ->
    name = msg.match[1]
    msg.send name
    base_url = process.env.HUBOT_GITHUB_API || 'https://api.github.com'
    github.repos.fork {"user":"Raven", "repo":"Raven","org":"codedemos"}, (err,data) ->
      if err
        msg.send "error :("
      else
        msg.send "Fork Complete..."

它编译成

// Generated by CoffeeScript 1.6.3
(function() {
  var githubApi;

  githubApi = require("node-github");

  module.exports = function(robot) {
    var github;
    github = new githubApi({
      "version": "3.0.0"
    });
    github.authenticate({
      "type": "basic",
      "username": process.env.HUBOT_GITHUB_USER,
      "password": process.env.HUBOT_GITHUB_PASSWORD
    });
    return robot.respond(/kickstart\s(\S+)/i, function(msg) {
      var base_url, name;
      name = msg.match[1];
      msg.send(name);
      base_url = process.env.HUBOT_GITHUB_API || 'https://api.github.com';
      return github.repos.fork({
        "user": "Raven",
        "repo": "Raven",
        "org": "codedemos"
      }, function(err, data) {
        var id;
        if (err) {
          return msg.send("error :(");
        } else {
          return id = data.id;
        }
      });
    });
  };

  msg.send("Fork Complete...");

}).call(this);

看起来没问题,但运行它会产生以下结果:

ReferenceError: msg is not defined
  at Object.<anonymous> (/opt/kbot/scripts/kickstart.coffee:48:2, <js>:36:3)
  at Object.<anonymous> (/opt/kbot/scripts/kickstart.coffee:33:1, <js>:38:4)
  at Module._compile (module.js:456:26)
1个回答

2

几乎可以确定最后一行出现了空格问题。请再次确认整个文件中是否使用了一致的缩进,并确保在 msg.send "Fork Complete..." 之后有一个最终换行符。我复制并粘贴了您的咖啡代码,并将其编译为JavaScript,最后一行 msg.send 被正确放置在适当的函数内,与您上面的js不同,其中该行处于错误的位置。


啊,是的,我没有注意到!这是Coffeescript的要求吗,在EOF处有一个空行?将来我应该使用一个可以显示空格的编辑器!谢谢。 - Sam
基本上,Coffeescript 需要理解缩进级别何时发生变化,在这种情况下,您不能以缩进的行而没有换行符来结束文件。如果文件的最后一行是左对齐的,您就不会遇到这种边缘情况。无论如何,将所有文本文件以换行符结尾一直是 Unix 的最佳实践,因此请将您的编辑器设置为自动执行此操作。是的,如果您要在空格相关语言中编写代码,最好使用具有良好显示和操作空格能力的编辑器。 - Peter Lyons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接