语法错误:保留字“function”

4
我正在尝试编写一个Github Hubot脚本,使用TooTallNate的Node-Spotify-Web通过Spotify播放音乐,而我对CoffeeScript(Hubot脚本的编写语言)有些陌生。我在此处编写了第一个命令“播放”:

http://pastebin.com/Pp6mqucm

lame = require('lame')
Speaker = require('speaker')
Spotify = require('spotify-web')

username = "INSERTUSERNAMEHERE"
password = "INSERTPASSWORDHERE"

robot.respond /play (.*)/i, (message) ->
  uri = message.match[1]
  Spotify.login(username, password, function (err, spotify)) {
        if (err) throw err;
        console.log('Playing: %s - %s', track.artist[0].name, track.name)
}
  spotify.get(uri, function(err, track){
        if err throw err;
        message.send("Playing:" + track.artist[0].name, track.name)
        })

在运行bin/hubot时,我遇到了错误“语法错误,保留字‘function’”,所以我按照另一个StackOverflow问题中的建议将'function'更改为'->'。修改后如下所示:

http://pastebin.com/dEw0VrH5

但仍然出现错误

错误:无法加载/home/xbmc/cbot/lisa/scripts/spotify: SyntaxError: 保留字"function"

这是因为依赖关系吗?我真的卡在这里了。


2
你是在使用CoffeeScript,就像你的问题所说的那样,还是像你放在标签中的JavaScript? - Chris Hayes
1
这个看起来不对 spotify.get(uri, ->(err, track){. 另外,你只需要将格式化的代码放入 SO(或任何在线位置),就需要将制表符转换为空格。 - elclanrs
CoffeeScript,非常抱歉我完全忘记为它添加标签了。 - ChiChu
代码必须放在问题中,而不是外部代码托管服务中。 - user229044
过去银行的代码是不正确的;它是JS和Coffeescript混合编写的。这个问题的原始版本已经足够说明提问者对问题至少有一定了解。 - elclanrs
@elclanrs: ->(err, track) { ... } 看起来像是 Ruby 的 "stabby" lambda,大致相当于 function(err, track) { ... }(JavaScript),或 (err, track) -> ...(CoffeeScript),或 lambda { |err, track| ... }(同样是 Ruby)。 - mu is too short
2个回答

4

其中,CoffeeScript文档的最初部分之一是如何声明函数。你不能只把单词function改成->,这并不简单。在Javascript中,函数是function(args) { body },但在CoffeeScript中是(args) -> body

但为了简洁起见,当你有这个:

Spotify.login(username, password, function (err, spotify)) {

那不会起作用的CoffeeScript,因为那不是声明函数的语法。你需要使用如下语法:
Spotify.login username, password, (err, spotify) ->
  # function body

这里也一样:

spotify.get(uri, function(err, track){

应该是:

spotify.get uri, (err, track) ->

谢谢,我很感激! - ChiChu

0

CoffeeScript 的函数语法是:

(arguments...) ->
    body

而不是

-> (arguments...) {
    body
}

你的语法也是正确的:

robot.respond /play (.*)/i, (message) ->
    uri = message.match[1]
    ....

你是从其他地方复制粘贴的代码片段吗?


我一直在尝试编写一个脚本,让hubot控制XBMC,大部分时间我都在理解一些东西,然后我尝试跟随这里的示例(https://github.com/TooTallNate/node-spotify-web/blob/master/example/play.js),同时也确保它适用于hubot。 - ChiChu
你的参考代码是JavaScript的,而你却在写CoffeeScript。这就好比从Faust的德语版中挑选单词来写英语作文一样。 :) - Amadan

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