2015-08-12 2 views
0

Я конвертирую код в ES6, и в какой-то части я пытаюсь понять привязку жирной стрелки. У меня был такой код:Fat arrow delegation

function callApi(api, payload, header) { 
    $http.post(api, payload, header) 
    .success(function(data) {...}) 
    .error(function (data, status) { handleError(data, status) }) 
} 

function handleError(data, status) {...} 

я изменила, что к этому, который работает:

callApi(api, payload, header) { 
    this.$http.post(api, payload, header) 
    .success((data) => {...}) 
    .error((data, status) => this.handleError(data, status)) 
} 

handleError(data, status) {...} 

Что не работает, когда я пытался позвонить HandleError так:

.error((data, status) => this.handleError) 

Я думал, что это может быть делегирование обработки ошибок функции handleError, но это не так. Может кто-нибудь помочь мне понять, что я не понимаю о привязке к стрелке, что его нельзя использовать как() => myFunction, и есть ли способ сделать такую ​​делегию, которая включает привязку this?

+0

'(a, b) => c' то же, что и' function (a, b) {return c} .bind (this) ' – elclanrs

+1

, это должно быть просто' .error (handleError) 'не нужно для ES6 для того, чтобы работать правильно. – zzzzBov

+0

'.error (handleError)' приводит к «handleError not defined». '.error (this.handleError)' rsesults в ошибке внутри handleError, когда я пытаюсь использовать 'this', что' this' не определено. – Kip

ответ

2

Я изменил, что (data, status) => this.handleError(…), который работает

Я беспокоюсь, если оба handleErrorthis.handleError и работа. Это может означать, что вы поместили их в глобальную область действия и вызываете свои функции без получателя. Я бы предложил позвонить по прямой ссылке (только handleError(…)) и использовать strict mode (который по умолчанию становится ES6).

Что не работает, когда я пытался позвонить HandleError так: (data, status) => this.handleError

Ну, просто: вы не вызова здесь, вы написали функцию стрелку, которая возвращает функцию handleError.

Вы должны быть в состоянии упростить код, хотя, не используя функцию стрелки на всех:

callApi(api, payload, header) { 
    this.$http.post(api, payload, header) 
    .success((data) => {...}) 
    .error(handleError) 
} 

Или, если handleError является метод this, хотя и опирается на вызывается на экземпляре, вы бы использовать .bind():

….error(this.handleError.bind(this)); 

В этом случае оригинал ES5 не работали, однако ?!

+0

Спасибо. @elclanrs сказал что-то подобное выше. Это сработало для меня: '.error (this.handleError.bind (this))' – Kip