在ES6中使用/绑定'this'与Bookshelf Promises

时间:2016-09-09 01:00:43

标签: node.js ecmascript-6 es6-promise hapijs bookshelf.js

我在使用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

1 个答案:

答案 0 :(得分:1)

没有;这正是箭头功能的反面。

箭头函数严格使用 lexical this - 它们继承了其包含块的this

无论您在调用箭头函数时bind()或手动传递为this,其this将始终来自包含范围。