我想在页面加载后立即在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())
});
});