解析参数&CoffeeScript中的匿名函数

Parsing Arguments & Anonymous functions in CoffeeScript

本文关键字:函数 CoffeeScript 参数 amp      更新时间:2023-09-26

如何将此函数转换为与coffeescript兼容的版本?

我的主要问题是fb.login。然而,我尝试过了,我似乎总是失去其中一个参数或权限。。。

function promptLogin(login_level, callback)
{
    var cbk = callback;
    FB.login(function(response) {
        if (response.session) {
            if (response.perms) {
                cbk( true, response );
            } else {
                cbk( false, response );
                //showAlert( "Please accept the permissions.", 'Error' );
            }
        } else {
            cbk( false, response );
            //showAlert( "Please accept the permissions.", 'Error' );
        }
        }, {perms:'email,publish_stream'}
    );
}

非常感谢。。。

Gareth

编辑

感谢您在下面给出的所有答案,有些有效,有些无效,有些给我带来了其他问题。

我已经确定了一个混合和匹配的解决方案:

login: (permissions = '', callback) ->
    responseHandler = (response) ->
        if response.session
            if permissions && permissions != ''
                if permissions == response.perms
                    AP.log 'Login accepted - Permissions Accepted', response
                    callback true, response
                else
                    AP.log 'Login rejected - Permissions Rejected', response
                    callback false, response
            else
                AP.log 'Login accepted - No Permissions', response
                callback true, response                 
        else
            AP.log 'Login rejected', response
            callback false, response
        return
    FB.login responseHandler, perms: permissions

感谢所有回答的人。我希望这能帮助其他人!

问候,

Gareth

当我获取js片段并想要时,我总是使用js2coffee咖啡脚本的快速转换。

http://ricostacruz.com/js2coffee/

promptLogin = (login_level, callback) ->
  cbk = callback
  FB.login (response) ->
    if response.session
      if response.perms
        cbk true, response
      else
        cbk false, response
    else
      cbk false, response
  , perms: "email,publish_stream"

然后迭代出明显的

promptLogin = (login_level, callback) ->
  cbk = callback
  FB.login (response) ->
    if response.session
      cbk response.perms, response
    else
      cbk false, response
  , perms: "email,publish_stream"

再次

promptLogin = (login_level, callback) ->
  FB.login (response) ->
    if response.session
      callback response.perms, response
    else
      callback false, response
  , perms: "email,publish_stream"

直到最后你得到

promptLogin = (login_level, callback) ->
  FB.login (response) ->
      callback
        if response.session then response.perms else false
        response
      , perms: "email,publish_stream"

为了可读性,我肯定会将您传递给FB.login的回调命名为:

promptLogin = (login_level, callback) ->
  responseHandler = (response) ->
    if response.session
      if response.perms
        callback true, response
      else
        callback false, response
        # showAlert 'Please accept the permissions.', 'Error'
    else # no session
      callback false, response
      # showAlert 'Please accept the permissions', 'Error'
    return
  FB.login responseHandler, perms: 'email,publish_stream'
  return

根据API,每个函数结尾的额外return可能重要,也可能无关紧要。只要注意你隐含的回报。

它未经测试,但我认为以下内容应该有效:

promptLogin = (login_level, callback) ->
  FB.login ((response) ->
    if response.perms and response.session
      cbk true, response
    else
      if not response.perms
        cbk false, response
        # showAlert ...
      else # if not response.session
        cbk false, response),
  perms: 'email,publish_stream'

当我遇到这些问题时,我会做两件事:

  1. 加上许多括号
  2. 将每个参数放入局部变量中

在这种情况下,括号有助于:

promptLogin = (login_level, cb) ->
FB.login(((response) ->
    cb response.perms and response.session, response),
    perms: 'email, publish-stream')

临时变量有帮助:

promptLogin = (login_level, cb) ->
    login = (response) -> cb response.perms and response.session, response
    options = perms: 'email, publish-stream'
    FB.login login, options

常见问题解答。

FB.login (response) ->
  if response.perms and response.session
    cbk true, response
  # ...
, perms: 'email,publish_stream'

最后一行的dedent+逗号就可以了。

这可以编译成功能等效的代码,其优点是更短。我建议在http://jashkenas.github.com/coffee-script/用于测试这样的东西。

promptLogin = (login_level, callback) ->
  FB.login (response) ->
    callback response.session and response.perms, response
    return
  , perms:'email,publish_stream'
  return

返回可能是不必要的,这取决于这些函数的返回值是否重要。