2015-12-30 4 views
0

Я хочу это сделать: проверьте, поставляется ли callback, поэтому я делаю это как следует. Что я хочу знать:лучший способ проверить последний элемент в coffeescript?

  1. Могу я проверить последний элемент проще?
  2. на самом деле это может быть неудачным в некоторой ситуации: если последний элемент является функцией, но это не callbak.

Вот код

_deferred = Q.defer() 
[before..., last] = args 
if typeof last is 'function' 
    args = before 
    cb = last 
else 
    cb = (err, results) -> 
     if err? 
      _deferred.reject(err) 
     else 
      _deferred.resolve(results) 
// ... other code 

ответ

0

немного короче версия с «Разделить» арг в списке параметров функции:

fn = (args..., cb) -> 
    _deferred = Q.defer() 

    # if cb is a function, it gets assigned to callback 
    # and we skip the following statements because not (true and true) == false 
    if not (typeof cb is 'function' and callback = cb) 
     # cb is not a function so it's just another arg 
     args.push cb 
     callback = (err, results) -> 
      if err? then _deferred.reject(err) else _deferred.resolve(results) 

    console.log args 
    console.log callback.toSource() # Function.toSource() only works on Firefox 
    # ... other code 

fn 'arg1', 'arg2', 'arg3',() -> 'foo' 

О втором вопросе, только вы знаете, что «истинный» обратный вызов есть или нет. Если вы не можете решить ее по типу, вы можете изменить формат параметров Fn, например, передать объект:

params = 
    callback:() -> 'foo' 
    args: [ 'arg1', 'arg2', 'arg3',() -> 'bar' ] 

fn2 = ({ callback, args }) -> 
    callback = callback or (err, results) -> 
     if err? then _deferred.reject(err) else _deferred.resolve(results) 

    console.log args 
    console.log callback.toSource() # again, this only works in Firefox 


fn2(params) 
0
cb = args.pop() # cb will be the last element, args will contain the rest 
if typeof cb isnt 'function' or cb.length isnt 2 # as a partial solution 
    cb = (err, results) -> 
     ...