簡體   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