异步数据库通信问题

时间:2011-06-08 08:22:10

标签: javascript firefox-addon

我正在使用firefox扩展中的sqlite数据库进行通信。首先,我使用this同步代码。然后我将其更改为this异步代码,但以错误结束 anchors[i] is undefined, Line 95
This更改没有帮助。

变量范围似乎存在一些问题。

谢谢你的帮助

1 个答案:

答案 0 :(得分: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]
        ...
    }