2014-12-22 7 views
5

Wenn Versprechen Verkettung in Coffeescript, Funktion definiert für dann müssen an 'diese' binden.coffeescript versprechen Verkettung mit Funktionsdefinition

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

Allerdings kompiliert das oben genannte, was falsch ist. Wie schreibe ich dann richtig? Oder gibt es eine Möglichkeit für Coffeescript, dies darzustellen?

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

Antwort

3

Verwenden => statt es selbst zu binden, wird es viel einfacher lesen und korrekt sein.

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

jedoch, die nicht wirklich sinnvoll ist, da Sie nicht auf this in Ihrer Funktion beziehen sich. Vielleicht möchten Sie einfach dosomething direkt an then() übergeben, so dass seine ThisBinding beibehalten wird.

+0

Es hilft. aber nach der Kompilierung zeigt der generierte JavaScript-Code immer noch '[" catch "] { return console.log ('error is', err); }));' –

+3

@WeideZhang: Was ist daran falsch? ? 'om()' und 'o ['m']()' sind äquivalent und ['catch' ist ein Schlüsselwort] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Statements/try ... catch), also verwendet CoffeeScript die String-Form. –

1

Nur weil Sie anonyme Funktionen verwenden können, bedeutet nicht, dass Sie müssen. Geben Sie Ihre Rückrufe Namen führt oft zu besseren Code:

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

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

Oder:

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 

Wenn Ihre Funktionen sind nur Einzeiler dann anonyme Funktionen sind in Ordnung, aber wenn sie länger sind, ist es sehr einfach um sich in CoffeeScripts Leerzeichen zu verlieren.