2011-06-08 61 views
0

我在firefox擴展中與sqlite數據庫進行通信。首先我使用了this同步碼。然後我將其更改爲this異步代碼,但它以錯誤結尾
anchors[i] is undefined, Line 95
This更改沒有幫助。異步數據庫通信的問題

似乎有變量範圍的問題。

謝謝大家幫忙

回答

1

一個問題是:anchors顯然是由document.anchors返回的節點集合。因此,它不是一個固定的列表,它會改變,如果文檔更改。在您的數據庫查詢正在運行時,可能會發生錨從文檔中被刪除的情況。爲了防止這樣的問題,可以使採集的副本:

var anchors = Array.prototype.slice.apply(document.anchors); 

這將使anchors規則陣列不會意外更改。

另一個問題是您的所有閉包函數使用相同的變量i(有關更多信息,請參閱https://developer.mozilla.org/en/JavaScript/Guide/Closures)。當handleResult執行時i將具有值anchors.length,因爲循環已完成。爲了防止這種情況,您需要捕獲例如i的「當前」值。在這樣的對象屬性:

statement.executeAsync({ 
    anchorIndex: i, 
    handleResult: function(aResultSet) { 
     ... 
     anchors[this.anchorIndex] 
     ... 
    } 
+0

錨是'變種錨= e.target.getElementsByTagName( 「A」);'的代碼的情況下是[這裏](http://stackoverflow.com/questions/6256653/javascript-code-too-slow-in-firefox-extension-using-storage-service)該函數在DOMContentLoaded事件上調用。 – xralf 2011-06-08 08:54:01

+0

同樣的問題 - 'getElementsByTagName'返回一個可以動態改變的節點集合。 – 2011-06-08 09:02:57

+0

[This](http://pastebin.ubuntu.com/621608/)更改沒有幫助。 – xralf 2011-06-08 09:05:30