2011-06-08 62 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