Как экспортировать только определенные методы из класса? - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть класс, который имеет 10 методов, и только 8 из этих 10 должны быть экспортированы, остальные 2 предназначены для аутентификации токенов, и я не хочу, чтобы они экспортировались, так как пользователю не нужно будет вызывать их никогда(Я пишу пакет для npmjs), мой вопрос, как экспортировать класс только с этими 8 методами, в то время как сам класс использует два других?

Редактировать: добавлен некоторый код

class StackClass {
  constructor(p1, p2) {
    this.data = {
      p1,
      p2,
      accessToken: null,
      expiresIn: null,
      tokenType: null
    };
  }

  async getToken() {
    return new Promise(async (resolve, reject) => {
      try {
        let fetchResponse = await fetch(
          "url with this.data.p1 and this.data.p2"
        );
        let fetchData = await fetchResponse.json();
        if (fetchData.status != 200) {
          reject("ERROR");
        } else {
          // get the token and save it in this.data
          this.data.accessToken = fetchData.access_token;
          this.data.expiresIn = fetchData.expires_in;
          this.data.tokenType = fetchData.token_type;
          resolve(fetchData);
        }
      } catch (err) {
        console.log(err);
      }
    });
  }
  async isTokenValid() {
    if (new Date() >= this.data.expiresIn) {
      // Generate a new Token
      try {
        await this.getToken();
      } catch (err) {
        console.log(err);
      }
    }
    // else - Do nothing and use current token saved in this.data.accessToken
  }
  async getData() {
    try {
      await this.isTokenValid();
      await fetch("url2 with this.data.accessToken");
    } catch (err) {
      console.log(err);
    }
  }
}

let user = new StackClass("username", "password");

user.isTokenValid(); // SHOULD BE PRIVATE
user.getToken(); // SHOULD BE PRIVATE
user.getData(); // SHOULD BE PUBLIC

Ответы [ 2 ]

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

Определите isTokenValid и getToken как автономные функции. Вам также следует избегать явной конструкции Promise antipattern, и только catch в месте, где вы можете разумно обработать ошибку, которая обычно находится в вызывающей стороне асинхронной функции (возможно, getData, возможно, впотребитель класса StackClass):

class StackClass {
  constructor(p1, p2) {
    this.data = {
      p1,
      p2,
      accessToken: null,
      expiresIn: null,
      tokenType: null
    };
  }
  async getData() {
    try {
      await isTokenValid(this);
      await fetch("url2 with this.data.accessToken");
    } catch (err) {
      // or you can just avoid the `try`/`catch` altogether,
      // and have the consumer of getData handle problems
      console.log(err);
    }
  }
}


function isTokenValid(stack) {
  if (new Date() >= stack.data.expiresIn) {
    // Generate a new Token
    return getToken(stack);
  }
  // else - Do nothing and use current token saved in this.data.accessToken
}
async function getToken(stack) {
  const fetchResponse = await fetch(
    "url with this.data.p1 and this.data.p2"
  );
  const fetchData = await fetchResponse.json();
  if (fetchData.status != 200) {
    throw new Error('error');
  } else {
    // get the token and save it in this.data
    stack.data.accessToken = fetchData.access_token;
    stack.data.expiresIn = fetchData.expires_in;
    stack.data.tokenType = fetchData.token_type;
  }
}
0 голосов
/ 10 ноября 2019

Почему вы не экспортируете функцию, которая принимает список аргументов, создает объект вашего класса с этими аргументами, а затем возвращает новый литерал объекта только с публичными методами? Взгляните:

my-class.js

class MyClass {

  constructor(f1, f2) {
    this.field1 = f1;
    this.field2 = f2;
  }
  m1() {

    this.m2();
  }
  m2() {

    console.log('this.field1', this.field1);
    this.m3();
  }
  m3() {
    console.log('this.field2', this.field2);
    this._m4();
  }

  _m4() {
    console.log('private m4');
    this._m5();
  }
  _m5() {
    console.log('private m5');
  }
}

module.exports = (f1, f2) => {

  const my = new MyClass(f1, f2);

  return {
    m1: my.m1.bind(my),
    m2: my.m2.bind(my),
    m3: my.m3.bind(my),
  }
}

index.js

const myObj = require('./my-class')('f1', 'f2');

myObj.m1();

Live demo

Таким образом, вы скрываете приватные методы, которые не должны быть доступны за пределами модуля.

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