IndexedDb Promise导致脚本阻塞

时间:2018-06-28 01:13:06

标签: javascript promise indexeddb

我环顾四周,没有提出任何可能是为什么我正在研究的东西行不通的原因。我已经进行了类似的实验,但我想最好还是顺其自然,为您提供我要完成的工作的布局。

//Main game loop
function(){
for(let i... iteration of gameObjects){
// go through object list and add at random to transfer lists like
jsEngine.transferList.push(jsEngine.objects[i])
}

// then place the array in the db (jsEngine is a class, jsEngine.transferBool 
//is a simple prop of jsEngine and so is the transferTimer)

let request = indexedDB.open(this.dbName,this.dbVersion);
    request.onsuccess = function(event){
        let db = event.target.result;
 //Failed attempt at controlling when saved
        if(jsEngine.transferBool === false&& jsEngine.transferTimer >= 48) {
            jsEngine.transferBool = true;
            jsEngine.transferTimer = 0;
        }
        IDBSendAndGrab(jsEngine, db).then(
            jsEngine.transferBool = false
        );
}

发送和获取功能

function IDBSendAndGrab(engine,db){
return new Promise (()=>{
    let completed = 0;
//main store
 let thisStore =db.transaction(engine.mainTransferStore.name,"readwrite")
 .objectStore(engine.mainTransferStore.name);


// check main store for objects , if there are any 
// procede to run a getall promise and when thats done
// run a clearStore promise and when that is done
//resolve IDBCheckStoreForConcat promise.

  IDBCheckStoreForConcat(engine,thisStore).then(()=>{

    for(let i =1; i<= engine.otherStores;i++){
// goes through a list of other object stores generated ,
//(I chose 4 stores)  
// (before all of this the onupgrade creates these stores and the engine just 
//gets the amount of stores to use as the "engine.otherStores").
// Next it uses the itorator and strings it 
//to access the stores (which are also stringed numbers) 
//and transfer the objects (if there are any to the store in question)

     IDBTransferObjects(engine,i,db).then(()=>{
         completed++;
         if(completed === engine.otherStores.length){
// the resolve once all the stores have had objects sent to.
             resolve()
         }
     })
    }
})
});
}

发生的事件列表是:

1。在引擎初始化之前创建商店

2.construct jsEngine类并将所有变量附加​​为props(例如transferBool),

3.run游戏循环,

4。在主游戏循环中使用for循环将对象添加到变化的传输列表中,

5。然后在主游戏循环中的for循环之后打开db,

6。检查主存储中是否有对象(如果随机插入,[主存储为“ 0”])并连接到我的obj池列表以再次插入,

7。将所有需要的objs添加到在转移清单中分配给它们的商店(通过在清单中的放置: array [1:[obj1:{Hell:“ o”}]],2:[没什么,所以不要加我] ...),

8。然后,当所有这些都解决后,继续游戏循环。

现在,它经过几个循环并阻塞ui后才使游戏处于空闲状态,仅当iI使用我的鼠标事件在屏幕坐标上进行挖掘时,它才解锁一个帧。我在“效果”标签中查看了它,感觉很奇怪,好像有90%的空闲状态。一切正常,但是我的用户界面被阻止了,我也不知道为什么。

免责声明:我不是要您重现此程序,也不是有人问我为什么要像这样构建它,“因为它可以通过另一种简单的方法来完成”,所以您必须知道所有这些我正在建造,这是唯一的方法。

但是我在问为什么上述逻辑不起作用的原因 以及如何解决。通过事件循环,通过堆栈和事件查询... input的类型。

1 个答案:

答案 0 :(得分:0)

我找到了答案,这仅仅是因为我在每一个滴答声中都在gameObjects上调用了getkeys,因此它导致了ofc的滞后,我将删除此帖子,并为您的时间浪费而感到抱歉。