【问题标题】:Javascript: Strange behavior when using promises, async-await, returns "Promise <pending>"Javascript:使用 Promise 时的奇怪行为,async-await 返回“Promise <pending>”
【发布时间】:2020-05-08 02:55:25
【问题描述】:

给定以下代码:

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

此代码返回:

但是,如果我尝试使用以下代码在构造函数中返回相同的结果:

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

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

返回以下内容:

我应该怎么做才能只检索前一个对象?

【问题讨论】:

标签: javascript promise async-await


【解决方案1】:

除了构造函数中的 Promise 问题之外,您的代码返回一个 Promise,因为这是您告诉它要做的:async 函数返回 Promise。如果您想要等待的 Promise 结果,请将行更改为

const token = await this.#token();

当然,在这种情况下,您需要构造函数是异步的,因此您需要将代码移到构造函数之外。

【讨论】:

  • 这就是我在第一部分(构造函数中的 Promises 问题)试图解决的问题,但在下面进行了澄清。
【解决方案2】:

您不能创建课程constructorasync。相反,只需创建自己的静态构造方法 -

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多