2014-12-22 25 views
5

Quando promettere il concatenamento in coffeescript, la funzione definita deve quindi essere associata a "questo".coffeescript promessa concatenamento con definizione della funzione

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

Tuttavia, quanto sopra compila in seguito, che è errato. Come scrivere correttamente allora? O c'è un modo in cui il coffeescript può rappresentare questo?

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

risposta

3

Uso => invece di legare da te, leggerà molto più facile e corretta.

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

tuttavia, che in realtà non ha senso in quanto non si fa riferimento a this nella funzione. Potresti voler passare semplicemente lo dosomething direttamente allo then(), quindi il suo ThisBinding viene conservato.

+0

Aiuta. ma dopo la compilazione, il codice javascript generato mostra ancora '[" catch "] (function (err) { return console.log ('error is', err); }));' –

+3

@WeideZhang: Cosa c'è che non va ? 'om()' e 'o ['m']()' sono equivalenti e ['catch' è una parola chiave] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Dichiarazioni/prova ... cattura) in modo che CoffeeScript utilizzi il formato stringa. –

1

Solo perché è possibile utilizzare le funzioni anonime non significa che sia necessario. Dare i vostri nomi callback spesso porta a codice più chiaro:

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

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

Oppure:

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 

Se le funzioni sono solo battute poi funzioni anonime vanno bene, ma se sono più a lungo, è molto facile perdersi negli spazi bianchi di CoffeeScript.

Problemi correlati