如何访问 属性 of class in promise?

how can access property of class in promise?

我有一个只有一种方法的 class。我想更改 return 类型的方法来承诺。但承诺无法访问 class 的属性。如何解决此问题。但出现此异常

原因:类型错误:无法读取未定义的 属性'bot'

const SDK = require('balebot');
const Promise = require('bluebird');

import incoming from './incoming';
const _ = require('lodash');

class Bale {
  constructor(bp, config) {
    if (!bp || !config) {
      throw new Error('You need to specify botpress and config');
    }
    this.bot = null;
    this.connected = false;
    this.bot = new SDK.BaleBot(config.botToken);
    bp.logger.info('bale bot created');
  }

  setConfig(config) {
    this.config = Object.assign({}, this.config, config);
  }


  sendText(chat, text, options) {
    let msg = new SDK.TextMessage(text);

    return new Promise(function (resolve, reject) {
      var response = this.bot.send(msg, receiver);
      if (response) {
        reject(err);
      } else {
        resolve(response);
      }
    });
  }


}

module.exports = Bale;

您需要 bind this 或使用箭头函数来保留 this 上下文:

const SDK = require('balebot');
const Promise = require('bluebird');

import incoming from './incoming';
const _ = require('lodash');

class Bale {
  constructor(bp, config) {
    if (!bp || !config) {
      throw new Error('You need to specify botpress and config');
    }
    this.bot = null;
    this.connected = false;
    this.bot = new SDK.BaleBot(config.botToken);
    bp.logger.info('bale bot created');
  }

  setConfig(config) {
    this.config = Object.assign({}, this.config, config);
  }


  sendText(chat, text, options) {
    let msg = new SDK.TextMessage(text);

    // Use an arrow function instead of function
    return new Promise((resolve, reject) => {
      var response = this.bot.send(msg, receiver);
      if (response) {
        reject(err);
      } else {
        resolve(response);
      }
    });
  }


}

module.exports = Bale;

这行得通

sendText() {
    return new Promise((resolve, reject) => {
      console.log(this.bot); // it  will not be undefined
    });
  }

之所以可行,是因为箭头函数在词法上绑定了它们的上下文,因此 this 实际上指的是原始上下文。