2015-02-12 49 views
0

当我拨打store.put(game)时,我有一个名为​​的巨大数组,该选项卡变成白色,并在chrome任务管理器中消失。基本上,过程只是停止和它未能存储阵列将大量字符串存储到IndexedDB中

var trans = this.db.transaction('Games', 'readwrite'); 
var store = trans.objectStore('Games'); 
store.get(new Date().toLocaleDateString() + ' ' + prize.value).onsuccess = function() { 
    var game = this.result; 
    game.combs = game.combs.concat(newCombs); //I'm appending to the game.combs array which is empty when I first run it (when it also crashes) 
    store.put(game); 
} 
trans.oncomplete = function(evt) { 
    arrLength = 0; 
    newCombs = []; 
} 

这就是game等于:

game = { 
    name: new Date().toLocaleDateString() + ' ' + prize.value, 
    date: new Date().toLocaleDateString(), 
    prize: prize.value, 
    playerData: [...], 
    points: {...} 
} 

上面部分是一个对象的方法,以便this不是窗口对象一切工作正常,直到代码命中:store.put(game);页面刚刚崩溃。

+0

你确定'this'是你认为它是? 'this'不会保留在匿名函数中,而是在'onsuccess'事件处理函数中的一个匿名函数中使用它。你有没有尝试记录'游戏'变量? – paldepind 2015-02-12 07:34:09

+0

@paldepind'this'在它正确的上下文中工作正常我得到正确的'游戏'对象。阅读评论(以防万一你得到这个问题)在底部我想出了我的问题,我不想复制粘贴在这里。 – 2015-02-12 19:41:14

回答

1

由于@paldepind建议您在onsuccess事件处理程序中更改作用域并忽略自定义对象。解决此

一种方法是采取封闭的优势,并分配this到一个局部变量,定义匿名回调函数之前:

var trans = this.db.transaction('Games', 'readwrite'); 
var store = trans.objectStore('Games'); 
var that = this; 
store.get(new Date().toLocaleDateString() + ' ' + prize.value).onsuccess =  function() { 
    var game = that.result; 
    game.combs = game.combs.concat(newCombs); 
    store.put(game); 
} 
trans.oncomplete = function(evt) { 
    arrLength = 0; 
    newCombs = []; 
} 
+0

'this.result'给了我正确的对象。第一行的这个方法只是我主要对象的一部分。我只是在展示某种方法。这不是“这个”,这是一个问题。顺便说一句,谢谢我找出了问题所在。 Concat只是缓慢的一个,我正在用'newCombs'结合concat来创建一个新数组。然后替换现有的'game.combs'数组。另外'indexedDB'用于处理大量数据,但不是一次处理。 – 2015-02-12 19:39:35

+0

当然,抱歉 - 结果是从你的得到,错误的结束!我发现indexedDB有很多较小的交易。祝你好运 :) – kes 2015-02-12 19:41:24