JavaScript - 将"this"与链式承诺一起使用



我正在用ES6编写一些Node代码。在我的代码中,我有一个类,如下所示。请注意,这是一个基本示例,旨在隔离和显示问题。

class MyClass {
  constructor() {
    this.id = uuid();
    this.number = Math.floor((Math.random() * 100) + 1);
  }
  process() {
    this.validateNumber()
      .then(this.generateImage)
      .catch(function(err) {
        console.log(err);
      })
    ;
  }
  validateNumber() {
    let self = this;
    var promise = new Promise(function(resolve, reject) {
      // do stuff with self.number
      resolve({});
    });
  }
  generateImage() {
    console.log(this);
    // the above prints "undefined" in the console window
    // how do I get this.number again?
  }
}

在此类中,您会注意到我在构造函数中生成了一个随机数。我希望这个数字在我的类中都可以在整个方法中使用。但是,由于我有一种将 promise 链接在一起的方法,因此this就像在执行validateNumber后失去意义一样。

我该如何解决这个问题?

ES6引入了一个名为箭头函数的功能。除了语法比传统的function语法更简洁之外,它还保留了上下文。实质上,您的代码可以更改为以下内容:

var promise = new Promise((resolve, reject) => {
      console.log(this); // MyClass
      resolve({});
});

您还需要保留then内的上下文

this.validateNumber()
    .then(() => this.generateImage());