2011-06-24 101 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