2016-09-09 12 views
0

У меня возникают проблемы с тем, что функции ES6 Arrow работают правильно с моей цепочкой обещаний Bookshelf/Bluebird.Использование/привязка «это» с обещаниями к книжной полке в ES6

Это рабочий код при использовании ES5 и Bluebird-х .bind({}):

exports.prospectorLead = function (query) { 
    return new Lead().where('id', query.lead_id).fetch({withRelated: Lead.RELATED, require: true }) 
    .bind({}) 
    .then(function (lead) { 

     this.lead = lead.serialize(); 
     this.company = this.lead.company.serialize(); 

     return API('prospector', 'v1/people/search', { 
      query: query.domain, 
     }); 
    }) 
    .then(function (prospects) { 
     console.log(this.lead.id, this.company.domain, prospects); 
    }) 
} 

Это сломанный код при использовании функции ES6 со стрелками, которые не имеют this установлены правильно:

exports.prospectorLead = function (query) { 
    return new Lead().where('id', query.lead_id).fetch({withRelated: Lead.RELATED, require: true }) 
    .then((lead) => { 

    this.lead = lead.serialize(); 
    this.company = this.lead.company.serialize(); 

    return API('prospector', 'v1/people/search', { 
     query: query.domain 
    }); 
    }) 
    .then((prospects) => { 
    console.log(this.lead.id, this.company.domain, prospects); 
    }) 
} 

Проблема Я вижу, что область действия this установлена ​​не на функцию exports.propspectorLead(), а на объем всего модуля. Что не было проблемой при вызове функции один, но когда я делаю тонну асинхронных вызовов этой функции, мои данные становятся коррумпированными, потому что this не имеет правильной области.

Что мне здесь не хватает? Я был в предположении, что использование функций стрелок позволит мне использовать this всю свою цепочку обещаний.

+1

Обратите внимание, что для реальной проблемы, которую вы пытаетесь решить с помощью 'bind', есть [гораздо лучшие решения] (http://stackoverflow.com/q/28250680/1048572). – Bergi

ответ

1

Нет; это точно противоположно тому, что делают функции стрелок.

функции стрелки используют строго лексическогоthis – они наследуют this их содержащего блока.

Независимо от того, что вы делаете bind() или вручную передаете как this при вызове функции со стрелкой, ее this всегда будет отображаться с учетом объема.