Javascript: странное поведение при использовании обещаний, asyn c -await, возвращает «Promise <pending>» - PullRequest
0 голосов
/ 07 мая 2020

Учитывая следующий код:

  async #token() {
    const value = await this.belcorp.getAccessToken();
    console.log(value);
  }

Этот код возвращает: enter image description here

Но если я попытаюсь вернуть тот же результат в моем конструкторе с этим code:

constructor() {
    const token = this.#token();
    console.log(token);
  }

  async #token() {
    return await this.belcorp.getAccessToken();
  }

возвращает следующее: enter image description here

Что мне делать, чтобы получить только предыдущий объект?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Вы не можете сделать класс constructor async. Вместо этого просто создайте свой собственный метод конструктора stati c -

class MyThing {
  constructor(token) { // cannot be async
    this.token = token // make sync instead
  }

  static async token() { // make static
    return new Promise(r =>
      setTimeout(r, 1000, "tkn123") // demo token response
    )
  }
  
  static async new () { // make async constructor
    return new MyThing(await this.token()) // await token
  }
}

const main = async () =>
{ console.log("loading...")
  const x = await MyThing.new() // <-- MyThing.new()
  console.log("got token:", x.token)
  return "done"
}

main().then(console.log, console.error)
// loading...
// got token: tkn123
// done
0 голосов
/ 07 мая 2020

Помимо проблемы с обещаниями в конструкторах, ваш код возвращает обещание, потому что это то, что вы ему сказали: async функции возвращают обещания. Если вместо этого вы хотите получить ожидаемый результат Promise, измените строку на

const token = await this.#token();

. Конечно, в этом случае вам понадобится асинхронный c конструктор, поэтому вам нужно будет переместить свой код за пределы вашего конструктор.

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