Как я могу назначить токен доступа свойству accessToken в конструкторе - PullRequest
0 голосов
/ 02 ноября 2019

Мне нужна помощь в назначении свойства accessToken в классе MyApi. кажется, что accessToken не назначается должным образом в моем конструкторе. Я хочу сохранить токен доступа в свойстве accessToken, чтобы использовать его в других методах. к сожалению, он не хранится должным образом.

Если я помещаю инструкцию для присваивания вне объекта запроса, свойство accessToken назначается, и я могу получить к нему доступ из других метидов, используя this.accessToken. токен доступа поступает через обратный вызов запроса, где я извлекаю его из тела. проблема в том, что он не сохраняется должным образом в свойстве accessToken.

var request = require("request");

class MyApi {
  constructor() {
    request({ url: "URL", headers: { Authorization: "Basic KEY" } }, function(
      error,
      response,
      body
    ) {
      if (error) {
        console.log(error);
      } else {
        // this console log statement logs the access token
        console.log(`Access Token : ${JSON.parse(body).access_token}`);

        // i try to set it into the accessToken property
        this.accessToken = JSON.parse(body).access_token;

        // This statement logs undefined, meaning my accessToken property is not beinga ssiged successfully
        console.log(`Access Token Two: ${this.accessToken}`);
      }
    });
  }

  newRequest(callback) {
    request(
      {
        // Also if i try to use the accessToken property here, the request returns an error that the access token is invalid
        method: "POST",
        url: "URL",
        headers: { Authorization: "Bearer " + this.accessToken },
        json: { key: "value", key: "value" }
      },
      function(error, response, body) {
        if (error) {
          console.log(error);
        } else {
          callback(JSON.stringify(body));
        }
      }
    );
  }
}

module.exports = MyApi;

Я хочу использовать токен доступа в других методах, таких как метод newRequest, для выполнения большего количества запросов. кто-нибудь помогите, я буду признателен

Дополнение:
Упрощенная версия:

function request(f) {
    f("Token");
}

class MyClass {
    constructor() {
        request(function(t) {
            this.token = t;
        }); //.bind(this));
    }
    getToken() {
        return this.token;
    }
}

const q = new MyClass();
console.log(q.getToken());

UPD: попробуйте запустить упрощенную версию, а затем проверьте комментарий.

1 Ответ

0 голосов
/ 02 ноября 2019

Просто используйте функции стрелок, проблема будет решена. Поскольку вы используете функцию, this относится к ссылке на функцию, а не к ссылке на объект класса

var request = require('request');

class MyApi {
  constructor() {
    request({
        url: "URL",
        headers: {
          "Authorization": "Basic KEY"
        }
      },
      (error, response, body) => {
        if (error) {
          console.log(error)
        } else {
          // this console log statement logs the access token
          console.log(`Access Token : ${JSON.parse(body).access_token}`)

          // i try to set it into the accessToken property
          this.accessToken = JSON.parse(body).access_token

          // This statement logs undefined, meaning my accessToken property is not beinga ssiged successfully
          console.log(`Access Token Two: ${this.accessToken}`)
        }
      }
    )
  }

  newRequest(callback) {
    request({
        // now it will work
        method: 'POST',
        url: "URL",
        headers: {
          "Authorization": "Bearer " + this.accessToken
        },
        json: {
          "key": "value",
          "key": "value"
        }
      },
      (error, response, body) => {
        if (error) {
          console.log(error);
        } else {
          ;
          callback(JSON.stringify(body));
        }
      }
    )
  }

}

module.exports = MyApi

Обратитесь this для хорошего объяснения this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...