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