SQLite 查询中的 JavaScript for 循环

2024-04-19

我创建了一个函数,它将从我的数据库返回字符串“path”。

    function getAudio(mid, cb) {
    //mid is an array containing the id to some multimedia files.
    for(i=0; i < mid.length; i++) {

        db.transaction(function(tx) {
                tx.executeSql('SELECT * FROM Multimedia WHERE Mid=' + mid[i] + ' AND Type=' + 2, [], function(tx, results) {    
                //type=2 is audio. (type=1 is picture file etc) There is only one audiofile in the array.
                    if(results.rows.length > 0) {
                        path = results.rows.item(0).Path; 
                        cb(path);
                    }
                }, errorCB);
        }, errorCBQuery);

    }//end for
}//end getAudio()

当我删除 for 循环时,查询成功,当 for 循环存在时, errorCBQuery 或 errorCB 被调用。

有想法该怎么解决这个吗?谢谢 :)


这是经典的闭包问题。transaction http://www.w3.org/TR/webdatabase/#dom-database-transaction is an 异步call,这意味着循环在您传入的函数被触发之前完成。该函数有一个持久的参考 to the i变量,而不是您调用时的副本transaction。所以每个函数(你在每个循环上生成一个)都看到i == mid.length因此mid[i] is undefined你的 SQL 就会变得混乱。

您需要做的是让回调关闭另一个变量,该变量在循环继续时不会改变。通常的方法是使用工厂函数:

function getAudio(mid, cb) {
    //mid is an array containing the id to some multimedia files.
    for(i=0; i < mid.length; i++) {

        db.transaction(makeTx(mid[i]), errorCBQuery);

    }//end for

    function makeTx(val) {
        return function(tx) {
            tx.executeSql('SELECT * FROM Multimedia WHERE Mid=' + val + ' AND Type=' + 2, [], function(tx, results) {    
            //type=2 is audio. (type=1 is picture file etc) There is only one audiofile in the array.
                if(results.rows.length > 0) {
                    path = results.rows.item(0).Path; 
                    cb(path);
                }
            }, errorCB);
        };
    }

}//end getAudio()

那里,我路过mid[i]进入makeTx函数,其中returns将被传递到的函数transaction。我们返回的函数关闭val调用的参数makeTx它创造了它,它不会改变。

那是一个minimal重写代码;你也许可以更进一步。例如,请参阅missingno对参数化语句问题的评论。


旁注:看起来你并没有声明i or path任何地方。如果这是真的,那么你就陷入了困境隐式全局变量的可怕之处 http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html。建议声明它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLite 查询中的 JavaScript for 循环 的相关文章

  • IE 11 使用 HTML input=file 标签时锁定文件

    我在 IE11 中使用文件输入中的浏览来选择文件 我在资源管理器中使用shift delete删除了该文件 然后 当我刷新文件夹时 我删除的文件会再次出现在资源管理器中 无论如何 我可以通过客户端 JavaScript 释放文件句柄吗 我在
  • 使用 Javascript 防止刷新“跳转”

    我注意到 如果您在一个页面上并且向下滚动了很多 如果您刷新页面 大多数浏览器会将您跳回到您的位置 有什么办法可以防止这种情况发生吗 我研究了两个选项 但在 Webkit Firefox 上都不一致 window scrollTo 0 1 h
  • 解析 Angular2 中的 xml 以在视图中呈现

    我是否需要解析 xml 以从 xml 获取数据以在 html 中呈现 我目前正在使用获取本地 xml 文件http get请求并在控制台日志中显示 xml 文件中的所有信息 我认为它只是在读取它 问题是如何在angular2中将xml转换为
  • 表单验证后 isValid 保持 false

    我有一个自定义验证函数 但即使它没有返回错误 表单仍然无效 我将以下属性传递给 Formik validate import files gt return import files values length 0 import files
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • 是否可以告诉 jsdoc 在与源代码分开的文件中查找该代码的文档?

    我希望内联注释尽可能短 因为我的经验是超过 3 或 4 行的注释往往会被掩盖 从而产生很多不必要的 阅读手册行 遗留系统要求我遵守与 jsdoc 兼容的格式来记录代码 如果要正确记录许多不言而喻的事情 则需要明确声明它们 实际上每个标签都可
  • 如何修复 Eslint 错误“prefer-destructuring”?

    我想像这样缩短 ES6 中的对象文字 const loc this props local 原因是loc foo 比打字容易得多this props local foo 但现在 ESLint 抱怨道 使用对象解构 prefer destru
  • 如何观察Firebase存储上传事件

    我有一个将照片上传到 Firebase 存储的 iOS 应用程序 以及一个连接到同一个 Firebase 的 Web 应用程序 有没有办法从网络上观察存储的变化 当上传照片时 只有iOS设备本身可以访问UploadTask 并且我没有看到o
  • TinyMCE 选择文本并使用 javascript 激活链接对话

    我正在尝试编写一个自动化 使用黄瓜 水豚 硒 测试 它将在tinymce框中选择一些文本 单击链接按钮 然后打开链接选择页面 但链接按钮仅在选择某些文本时才变为活动状态 所以第一轮 tinyMCE activeEditor selectio
  • 如果我想让我的网站跨平台兼容和屏幕阅读器兼容,我应该避免使用 javascript 、 jquery 、 flash 、 ajax 、 silverlight 吗?

    如果我想让我的网站跨平台兼容 PC iPHONE 其他手机 PDA 和 Accessible 兼容屏幕阅读器 我是否应该避免使用 JavaScript jQuery flash Ajax Silverlight 我应该只使用 xhtml c
  • Html页面在底部加载

    我需要一个 HTML 页面在页面加载时自动向下滚动 所以基本上加载在底部 可以使用JavaScipt吗 请您帮助我或引导我走向正确的方向 感谢所有帮助 谢谢 尝试这个 window scroll 0 document documentEle
  • 什么是 TypeScript?为什么我要用它代替 JavaScript? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 您能描述一下 TypeScript 语言是什么吗 它能做什么 JavaScript 或可用库不能做的事情 这让我有理由考虑它 我最初写
  • 如何将java数组列表转换为javascript数组? [复制]

    这个问题在这里已经有答案了 我们如何将 String 对象的 java arraylist 转换为 javascript 数组 这就是我正在做的事情 但我正在寻找更好的方法来做到这一点 我不想迭代数组列表 var myArray
  • 哪个 SVG/SMIL DOM 元素具有“beginElement”方法?

    最终 这是针对将在 Firefox 中运行的 Kiosk 风格的应用程序 使用 jQuery 1 6 4 因此答案可能是特定于 Firefox 的 我正在尝试制作动画 SVG 但我正在尝试通过动态插入 SMIL 来为其设置动画 我没有看到任
  • 防止IndexedDB请求错误取消事务

    我的意图 循环localStorage并将数据放入IndexedDB 如果发生某些已知错误 例如当键已存在时出现 ConstraintError 我想忽略这些特定错误 以便事务不会中止 当请求触发错误时 中止事务是默认行为 问题 我以为使用
  • 定位分离的 DOM 树内存泄漏

    我在诊断主要使用 Knockout 构建的非常大的单页 Web 应用程序中的分离 DOM 树内存泄漏时遇到问题 我已经调整了应用程序以附加一个假人FooBar对象特定的 HTML 按钮元素 当用户移动到应用程序的不同 页面 时 该元素应该被
  • 如何在.Net中使用SQLCipher

    我想用C winform 读取一个SQLCipher数据库并找到一个开源项目SQLitePCL https github com ericsink SQLitePCL raw 但是我还没有找到这个使用的例子 而且文档也不是很多 有朋友用过这
  • 是否包括触摸事件客户端X/Y 滚动?

    我正在尝试获取相对于的触摸坐标viewport来自触摸事件的浏览器 例如触摸启动 我尝试从 clientX Y 属性获取它们 但两者实际上都返回包括滚动在内的值 这是违反规范的 因为它说 clientX Y 应该返回坐标而不滚动 我尝试添加
  • 不透明的回复有哪些限制?

    不透明的回应 https fetch spec whatwg org concept filtered response opaque被定义为一部分获取API https fetch spec whatwg org 并表示向远程源发出请求的
  • Android 数据库(SQLite)从空表返回非空游标

    我使用 SQLite 数据库浏览器验证该表不包含任何行 我单步执行查询生成器代码来获取生成的查询 并在 SQLite 数据库浏览器中运行该查询 查询返回零行 但是 Android 的 SQLiteQueryBuilder query 方法返

随机推荐

  • 注册用户时 django-registration 中出现 NotImplementedError

    我有一个 django 应用程序并尝试使用django registration应用程序在其中 下面是我的设置和代码 设置 py INSTALLED APPS django contrib auth django contrib conte
  • SQL Server 2008删除特殊模式下的所有表

    您好 我想知道是否可以使用一个 sql 查询或特殊脚本删除在自定义模式 例如 DBO1 下创建的数据库中的所有表 Thanks 这将为您生成所有 DROP TABLE 语句并打印 SQL 语句 然后 您可以在复制和执行之前验证它是否符合您的
  • 我们什么时候应该考虑使用私有的还是受保护的?

    只是想知道 我们什么时候应该真正必须使用private or protected对于模型中的某些方法 有时我不厌其烦地将我的方法分组private nor protected 我就让它保持原样 但我知道这一定是一个不好的做法 否则这两个分组
  • makefile patternrule 在目标文件名中带有更多通配符

    我需要创建一个特殊的 makefile 规则 最好通过一个示例来解释 也许我们用规则创建文件 test pdf tex pdflatex jobname test tex result pdf tex pdflatex jobname re
  • Visual Studio 2010 调试速度慢

    我在使用 Visual Studio 2010 时遇到问题 当我开始调试时 它运行缓慢 Internet Explorer 打开 但网站加载速度极其缓慢 我的同事和我在同一个项目上工作 他没有任何这样的问题 我的硬件是4G内存 Intel
  • Java Collections.sort(nodes) 使用什么排序?

    我认为是MergeSort 即O n log n 但是 以下输出不同意 1 0000000099000391 0000000099000427 1 0000000099000427 0000000099000346 5 0000000099
  • 将 functools.partial 与部分参数一起使用[重复]

    这个问题在这里已经有答案了 尝试部分操作时 我观察到以下行为 首先 我定义了一个函数foo它需要 2 个非关键字参数 gt gt gt def foo salutation name print salutation name 然后 我使用
  • DJango过滤器查询集

    我是 DJango 和 DRF 的新手 并被要求管理一些 DJango DRF 相关代码 经过大量搜索后 我仍然无法找到有关 filter queryset 如何工作以及如何与不同参数一起使用的完整示例 在某些地方我看到它的用法如下 sel
  • 投票数据库架构

    民意调查的最佳数据库架构是什么 一对多关系对此有好处吗 我正在考虑有两张桌子 poll questions int id varchar body datetime created at datetime updated at poll a
  • 使用 python 字符串格式插入制表符

    我正在尝试使用 format 形成一个字符串 但无法弄清楚这一点 lems scaena persona improbus for i in lems print format i t whatever 但拉环并没有像我想象的那样拉紧 实际
  • 如何解决“在 iOS 上使用 expo 播放视频但没有声音”的问题

    我使用世博会的视频组件 我可以播放视频 但在 iOS 中没有声音 在安卓上没问题 我该如何解决它
  • 在运行时停止/启动 WCF MEX 服务

    是否可以 如何在运行时停止和启动自托管 WCF 服务的 HTTP MEX 侦听器而不影响主 WCF 服务 请不要问我为什么要这样做 这是一种绕过别人人为限制的黑客行为 在重新测试和代码清理后重新添加了这个答案 这是我添加到我的基于 WCF
  • R:sample()命令受约束

    我试图从 0 到 7 随机抽取 7 个数字 有替换 但受到所选数字加起来为 7 的约束 例如 输出 0 1 1 2 3 0 0 没问题 但输出1 2 3 4 5 6 7 不是 有没有办法在添加约束的情况下使用示例命令 我打算使用以示例命令作
  • “在预期的位置未找到 FROM 关键字”

    SELECT distinct REPLACE CM NAME as CM NAME TO CHAR Booking Date MM DD YYYY AS Booking Date where Booking Date 03 20 2018
  • Logstash 解析时间戳半天上午/下午

    Logstash 新手 真的很喜欢它 尝试解析包含时间戳的 CSV 文件 想要解析时间戳并将其用作 timestamp字段 我的 CSV 输入示例 input stdin filter filter the input by csv i e
  • 使用 Microsoft.Web.Administration 远程管理 IIS 时身份验证期间出现 COMException

    设想 我需要远程管理与请求更改的服务器位于同一域的 IIS 服务器 创建和销毁应用程序 我有一个应用程序池设置为在授权帐户下运行 我已经使用 IIS 管理器和 Web 池成功运行的帐户测试了远程配置 因此我知道权限是正确的 我通过代码执行此
  • 为什么 Linq Cast<> 帮助器不能与隐式转换运算符一起使用?

    在决定重复投票之前 请阅读全文 我有一个实现的类型implicit cast运算符转换为另一种类型 class A private B b public static implicit operator B A a return a b c
  • 根据 pandas 中另一列的值创建新列

    我有这个 pandas 数据框 其 代码 列包含顺序分层代码 我的目标是使用每个层次级别代码及其名称创建新列 如下所示 原始数据 Code Name 0 A USA 1 AM Massachusetts 2 AMB Boston 3 AMS
  • 通过不加载主题和插件使 WordPress WP-API 更快

    我想更快地向 WordPress API 发出请求 我的API是在插件中实现的 使用register rest route来注册我的路线 然而 由于这是一个插件 所以所有内容都已加载 子主题和主题 并且基本上对该 API 的查询需要半秒 因
  • SQLite 查询中的 JavaScript for 循环

    我创建了一个函数 它将从我的数据库返回字符串 path function getAudio mid cb mid is an array containing the id to some multimedia files for i 0