Javascript 异步数据库通信问题

Javascript 异步数据库通信问题,javascript,firefox-addon,Javascript,Firefox Addon,我正在firefox扩展中与sqlite数据库通信。首先,我使用了同步代码。然后我将其更改为异步代码,但以错误结束 锚点[i]未定义,第95行 改变没有帮助 变量范围似乎存在一些问题 感谢您的帮助一个问题是,锚定显然是由文档返回的节点集合。锚定。因此,它不是一个固定的列表,如果文档发生更改,它将发生更改。在数据库查询运行时,可能会从文档中删除锚。要防止出现此类问题,您可以制作集合的副本: var anchors = Array.prototype.slice.apply(document.anc

我正在firefox扩展中与sqlite数据库通信。首先,我使用了同步代码。然后我将其更改为异步代码,但以错误结束
锚点[i]未定义,第95行

改变没有帮助

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


感谢您的帮助

一个问题是,
锚定
显然是由
文档返回的节点集合。锚定
。因此,它不是一个固定的列表,如果文档发生更改,它将发生更改。在数据库查询运行时,可能会从文档中删除锚。要防止出现此类问题,您可以制作集合的副本:

var anchors = Array.prototype.slice.apply(document.anchors);
这将使
锚定
成为不会意外更改的常规数组

另一个问题是,所有闭包函数都使用相同的变量
i
(有关更多信息,请参阅)。当
handleResult
执行时,
i
将具有值
anchors.length
,因为循环已经完成。要防止出现这种情况,您需要捕获
i
的“当前”值,例如在对象属性中,如下所示:

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

锚是
var锚=e.target.getElementsByTagName(“a”)代码的上下文是在DOMContentLoaded事件上调用的函数。同样的问题-
getElementsByTagName
返回一个可以动态更改的节点集合。它可以动态更改,但我认为在99%的情况下它不会更改,但最好知道,因此,我将在我的代码中更正它。当然,它没有帮助-现在将
anchorIndex
的声明移动到对象内部,也许您不会再得到语法错误。您指的是哪个对象内部?