2014-12-22 11 views
5

Kiedy obiecuję łańcuchowanie w coffeescript, zdefiniowana funkcja musi wtedy wiązać się z "tym".coffeescript obietnica łańcuchowa z definicją funkcji

$q.fcall somecall 
    .then ((url)-> 
    dosomething() 
    ).bind(this) 
    .catch (err)-> 
    console.log 'error occured', err 

Jednak powyższe kompiluje się w następujący sposób, który jest nieprawidłowy. Jak zatem poprawnie pisać? Czy istnieje sposób, aby coffeescript mógł to przedstawić?

$q.fcall(somecall).then(((function(url) { 
    dosomething() 
    }).bind(this))["catch"](function(err) { 
    return console.log('error occured', err); 
    }))); 

Odpowiedz

3

Używając => zamiast wiązania go samodzielnie, będzie to znacznie łatwiejsze i poprawne.

$q.fcall somecall 
.then (url) => 
    dosomething()  
.catch (err)-> 
    console.log 'error occured', err 

jednak, że tak naprawdę nie ma sensu, ponieważ nie odnoszą się do this w swojej funkcji. Być może zechcesz po prostu przekazać dosomething bezpośrednio do then(), aby zachować jego ThisBinding.

+0

Pomaga. ale po kompilacji wygenerowany kod javascript nadal pokazuje '[" catch "] (function (err) { return console.log (" błąd jest ", err); }));' –

+3

@WeideZhang: Co jest nie tak z tym ? 'om()' i 'o ['m']()' są równoważne, a ['catch' jest słowem kluczowym] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Instrukcje/try ... catch), więc CoffeeScript używa formy łańcuchowej. –

1

To, że możesz korzystać z funkcji anonimowych, nie oznacza, że ​​musisz. Nadawanie nazw Callbacki często prowadzi do wyraźniejszego kodu:

some_descriptive_name = (url) -> 
    dosomething() 
the_error = (err) -> 
    console.log 'error occurred', err 

$q.fcall somecall 
    .then some_descriptive_name.bind(@) 
    .catch the_error 

czyli

some_descriptive_name = (url) => # fat-arrow instead of bind 
    dosomething() 
the_error = (err) -> 
    console.log 'error occurred', err 

$q.fcall somecall 
    .then some_descriptive_name 
    .catch the_error 

Jeśli funkcje to tylko jeden wkładki następnie funkcje anonimowe są w porządku, ale jeśli są one dłużej, to jest bardzo łatwe zagubić się w białej plamie CoffeeScript.