我有一个 Web 应用程序,我在其中加载(通过 ajax)一个字典文件(1MB)到 javascript 数组中。我找到了Mobile Safari 在 10 秒后崩溃的原因。但现在我想知道的是如何解决这个问题?
在上面的链接上,答案建议使用setInterval
,但这意味着我必须将字典文件分块并逐个加载。这当然可以做到,但是考虑到互联网速度,我必须制作很多块,并且页面加载需要永远加载太多请求(如果我让块太大,一些移动用户可能会发生这种情况将无法在给定的 10 秒内下载该块)。
所以,我的问题是:有没有人遇到过这种问题,你是怎么解决的?对正确方向的普遍推动表示赞赏。
编辑:这是我用来加载字典的 js 代码:
var dict = new Trie();
$.ajax({
url: 'data/dictionary_342k_uppercase.txt',
async: true,
success: function (data) {
var words = data.split('\n');
for (var i = words.length - 1; i >= 0; i--) {
dict.insert(words[i]);
}
},
error: function(){
$('#loading-message').text("Problem s rječnikom");
}
});
Trie.js:
function Trie () {
var ALPHABET_SIZE = 30;
var ASCII_OFFSET = 'A'.charCodeAt();
this.children = null;
this.isEndOfWord = false;
this.contains = function (str) {
var curNode = this;
for (var i = 0; i < str.length; i++) {
var idx = str.charCodeAt(i) - ASCII_OFFSET;
if (curNode.children && curNode.children[idx]) {
curNode = curNode.children[idx];
} else {
return false;
}
}
return curNode.isEndOfWord;
}
this.has = function (ch) {
if (this.children) {
return this.children[ch.charCodeAt() - ASCII_OFFSET] != undefined;
}
return false;
}
this.next = function (ch) {
if (this.children) {
return this.children[ch.charCodeAt() - ASCII_OFFSET];
}
return undefined;
}
this.insert = function (str) {
var curNode = this;
for (var i = 0; i < str.length; i++) {
var idx = str.charCodeAt(i) - ASCII_OFFSET;
if (curNode.children == null) {
curNode.children = new Array(ALPHABET_SIZE);
curNode = curNode.children[idx] = new Trie();
} else if (curNode.children[idx]) {
curNode = curNode.children[idx];
} else {
curNode = curNode.children[idx] = new Trie();
}
}
curNode.isEndOfWord = true;
return curNode;
}
}