请教一下js中这种异步的初始化该怎么设计?

demo需要flagtrue才能进行其他的操作,然后flag的值是由asyncFn给的。
一开始实例化demo之后立马调用了fnB方法,但是因为asyncFn的关系这时候flag还没变为true,所以又执行了一遍fnA方法,请问大佬这里有办法只执行一遍fnA吗?

function asyncFn(): Promise<boolean> {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(true)
    }, 1000)
  })
}

class demo {
  flag = false;

  constructor() {
    this.fnA()
  }

  private async fnA() {
    this.flag = await asyncFn();
  }

  async fnB() {
    if (!this.flag) await this.fnA();
  }
}

const d = new demo();
d.fnB();
阅读 2.1k
2 个回答
✓ 已被采纳

将flag替换成一个返回boolean的promise就可以了

function asyncFn(): Promise<boolean> {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(true)
    }, 1000)
  })
}

class demo {
  flag$ = null;

  constructor() {
    this.fnA()
  }

  private async fnA() {
    await (this.flag$ = asyncFn());
  }

  async fnB() {
    if (!this.flag$) await this.fnA();
  }
}

const d = new demo();
d.fnB();
function asyncFn(): Promise<boolean> {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(true)
    }, 1000)
  })
}

class demo {
  flag = false;

  constructor() {
    this.fnA()
  }

  private async fnA() {
    this.flag = await asyncFn();
    this.fnB()
  }

  async fnB() {
    if (!this.flag) await this.fnA();
  }
}

const d = new demo();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏