辞書ファイル (1MB) を javascript 配列に (ajax 経由で) ロードする Web アプリケーションがあります。Mobile Safari が 10 秒後にクラッシュする理由がわかりました。しかし、今私が疑問に思っているのは、この問題をどのように回避するのですか?
上記のリンクでは、 を使用することを提案してsetInterval
いますが、これは辞書ファイルを断片に分割し、それらを 1 つずつロードする必要があることを意味します。これは確かに実行できますが、インターネットの速度を考慮して多くのチャンクを作成する必要があり、リクエストが多すぎるとページの読み込みに永遠に時間がかかります (チャンクを大きくしすぎると、一部のモバイル ユーザーが特定の 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;
}
}