2011-06-24 34 views
2

如何将此函数转换为兼容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'} 
    ); 
} 

最欣赏...

加雷斯

编辑

感谢所有低于你的答案,有的工作有的没有,有的给我带来其他ISSU ES。

我对解决方案的混搭解决:

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 

谢谢所有谁回答。我希望这可以帮助别人!

亲切的问候,

加雷思

回答

0

我肯定会的名字,你传递给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 s的每个函数的最后可能会或可能没有关系,这取决于API 。只要知道你的隐性回报。

0

这是未经测试,但我觉得有以下应该工作:

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' 
+0

不幸的是,仍然不解析的权限:( – ThinkGareth

0

当我遇到这些问题,两件事情我做的是:

  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 
+0

我试图将第二个(最可读)的例子工作到我的脚本,但它只是错误:'响应未定义'。 promptLoginTwo =(login_level,CBK) - > loginCbk =(响应) - > \t \t如果response.perms和response.session \t \t \t CBK真,响应 \t \t别的 \t \t \t警报(”对不起,您必须接受许可“) \t \t \t CBK假,响应 选项=烫发: '电子邮件,publish_stream' 的FB.login loginCbk,选择 – ThinkGareth

0

一个FAQ

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

最后一行上的缩进+逗号是有用的。

0

这编译为似乎是功能相当的代码,其优点是更短。我建议使用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 

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

7

我总是使用js2coffee,当我抓住js snippets并且想要 快速的咖啡转换。

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" 
+0

+1 js2coffee,很好的参考 – rodowi