我想在页面加载后立即在JavaScript中预加载搜索索引,这样用户可能不必等待构建它。我知道JavaScript是单线程的,通常不需要锁,但是我不确定以下代码是否足够:

class Index
{
  constructor()
  {
    this.index = null;
  }

  async init()
  {
    this.index = await queryDatabase();
  }

  async search(input)
  {
    if(!this.index) {await this.init();}
    return this.index.query(input);
  }
}

Index index = new index();
index.init(); // preload
myButton.addEventListener("click",console.log(index.search()));


用户是否可以在init()完成之前单击myButton并两次调用init呢?如果没有,我如何才能最好地防止这种情况发生?

最佳答案

init()async,它返回一个promise,您可以在查询数据库后添加事件侦听器:

class Index {
  constructor() {
    this.index = null;
  }

  async init() {
    this.index = await queryDatabase();
  }

  async search(input) {
    if (!this.index) {
      await this.init();
    }
    return this.index.query(input);
  }
}

Index index = new index();

index.init().then(() => {
  // add the event listener after the init
  myButton.addEventListener("click", function(){
   console.log(index.search())
  });
});

10-05 20:55
查看更多