我在使用Bookshelf / Bluebird保证链正常运行ES6 Arrow功能时遇到了问题。
这是使用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);
})
}
使用没有正确设置this
的ES6箭头功能时,这是破解的代码:
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
。
答案 0 :(得分:1)
没有;这正是箭头功能的反面。
箭头函数严格使用 lexical this
- 它们继承了其包含块的this
。
无论您在调用箭头函数时bind()
或手动传递为this
,其this
将始终来自包含范围。