Разбор аргументов и анонимных функций в CoffeeScript - PullRequest
2 голосов
/ 24 июня 2011

Как я могу превратить эту функцию в версию, совместимую с 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

Спасибо всем, кто ответил.Я надеюсь, что это помогает другим!

С уважением,

Гарет

Ответы [ 6 ]

7 голосов
/ 01 июля 2011

Я всегда использую js2coffee, когда беру js-фрагменты и хочу быстрого преобразования coffeescript.

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 голосов
/ 25 июня 2011

Это компилируется в то, что кажется функционально эквивалентным кодом, с преимуществом гораздо короче. Я бы предложил использовать компилятор реального времени coffeescript на 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

Возвращения могут быть ненужными в зависимости от значения возвращаемых значений этих функций.

0 голосов
/ 25 июня 2011

Я бы определенно назвал обратный вызов, который вы передаете 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 голосов
/ 24 июня 2011

A FAQ .

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

Дудент + запятая в последней строке делает свое дело.

0 голосов
/ 24 июня 2011

Когда я сталкиваюсь с этими проблемами, я делаю две вещи:

  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 голосов
/ 24 июня 2011

Это не проверено, но я думаю, что должно работать следующее:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...