繁体   English   中英

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

[英]Parsing Arguments & Anonymous functions in CoffeeScript

如何将该功能转换为兼容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'}
    );
}

非常感谢...

加雷思

编辑

感谢您在下面提供的所有答案,有些工作没有完成,有些导致了我其他问题。

我已经确定了各种解决方案的搭配:

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

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

亲切的问候,

加雷思

当我获取js代码片段并想要快速的coffeescript转换时,我总是使用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"

它未经测试,但我认为以下方法可以工作:

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 +逗号可以解决问题。

为了便于阅读,我绝对会命名为传递给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

每个函数末尾的额外return可能无关紧要,具体取决于API。 只要注意您的隐性回报。

这可以编译为功能上等效的代码,并且具有更短的优势。 我建议使用http://jashkenas.github.com/coffee-script/上的coffeescript实时编译器来测试类似的东西。

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

根据那些函数的返回值是否重要,返回可能是不必要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM