【问题标题】:Bluebird overwriting constructor [duplicate]蓝鸟覆盖构造函数[重复]
【发布时间】:2015-09-02 19:54:21
【问题描述】:

我目前正在编写我的承诺链,并且遇到了 Bluebird 的一个奇怪问题。使用 babel-node 和 ES6,我试图创建一个不需要我必须做 .then(function() { return foo(); }); 而是 .then(foo) 的承诺链。问题是当函数以较短的形式调用时,我的构造函数中的数据会被删除。

这是一个简单的例子。

import Promise from 'bluebird';

class TestClass {
  constructor() {
    this.my_var = 'Hello!';
  }

  startOne() {
    var self = this;
    return this.wait()
      .then(function() { return self.myself(); });
  }

  startTwo() {
    return this.wait().then(this.myself);
  }

  wait() {
    return Promise.delay(1000);
  }

  myself() {
    if (!this) return console.log('I\'m not feeling like myself today...');
    console.log(this);
  }
}


var foo = new TestClass();
foo.startOne();
foo.startTwo();

foo.startOne() 被调用时,它使用的是较长版本的链,它会正确返回{my_var: 'Hello'}。然而当foo.startTwo()被调用时,this就是undefined

这是为什么呢?我如何错误地编写我的链 this 变得未定义?还是真的应该像第一个例子那样写?

谢谢。

【问题讨论】:

  • 这是一个基本的 JS 问题,如果您查看 stackoverflow.com/questions/3127429/…,第一个答案中的示例 #3 说明了您的问题。你正在做var tmp = this.myself; tmp(),这使得this === undefined。由于您使用的是 ES6,请使用箭头函数,例如.then(() => this.myself()) 这样的问题经常被问到,我不知道该把它复制成什么。
  • @loganfsmyth:我们有一个专门用于 bluebird 承诺的 :-)

标签: javascript ecmascript-6 bluebird


【解决方案1】:

这是传递函数引用的常规 Javascript 问题(与 Promise 无关)。

当您将this.myself 作为函数参数传递时,实际传递的只是对myself 函数的引用,并且与this 对象的绑定丢失,因此在调用该函数时,this指针将是错误的,不会指向您对象的实例数据。有很多方法可以解决这个问题。这是传递作为方法的回调函数的通用 Javascript 问题。有很多方法可以解决这个问题。

您可以使用.bind() 来保留this 引用属性,如下所示:

 return this.wait().then(this.myself.bind(this));

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 2014-02-17
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多