Javascript 函数需要很长时间才能完成
Javascript function taking too long to complete?
下面是我遇到问题的代码狙击。目的是检查数据库中的重复条目,如果为真或假,则返回带有布尔值的"h"。出于测试目的,我返回了"h"的真实布尔值,但在警报(duplicate_count(时;行执行时duplicate_count仍为 0。即使执行 +1 的警报。
对我来说,似乎函数 updateUserFields 需要更长的时间来执行,因此在到达警报之前需要更长的时间才能完成。
有什么想法或建议吗?谢谢!
var duplicate_count = 0
for (var i = 0; i < skill_id.length; i++) {
function updateUserFields(h) {
if(h) {
duplicate_count++;
alert("count +1");
} else {
alert("none found");
}
}
var g = new cfc_mentoring_find_mentor();
g.setCallbackHandler(updateUserFields);
g.is_relationship_duplicate(resource_id, mentee_id, section_id[i], skill_id[i], active_ind,table);
};
alert(duplicate_count);
没有任何理由使用客户端JavaScript/jQuery从数据库中删除重复项。 除了安全问题(还有很多(,还有一种更简单的方法来确保数据库中的条目是唯一的:使用 SQL。
SQL 能够表达表列中没有重复项的要求,数据库引擎将为您强制执行,永远不会让您首先插入重复条目。 语法因数据库引擎而异,但无论何时创建表,都可以指定列必须是唯一的。
让我们使用 SQLite 作为我们的示例数据库引擎。 您问题的相关部分现在可能用这样的表格表示:
CREATE TABLE Person(
id INTEGER PRIMARY KEY ASC,
-- Other fields here
);
CREATE TABLE MentorRelationship(
id INTEGER PRIMARY KEY ASC,
mentorID INTEGER,
menteeID INTEGER,
FOREIGN KEY (mentorID) REFERENCES Person(id),
FOREIGN KEY (menteeID) REFERENCES Person(id)
);
但是,您可以通过将(mentorID, menteeID)
对更改为主键来强制唯一性,即要求任何(mentorID, menteeID)
对都是唯一的。 这之所以有效,是因为每个主键只允许一个副本。 然后,MentorRelationship
表变为
CREATE TABLE MentorRelationship(
mentorID INTEGER,
menteeID INTEGER,
PRIMARY KEY (mentorID, menteeID),
FOREIGN KEY (mentorID) REFERENCES Person(id),
FOREIGN KEY (menteeID) REFERENCES Person(id)
);
编辑:根据评论,提醒用户重复项,但实际上并未删除它们
这在SQL中仍然比使用JavaScript要好得多。 当你在 JavaScript 中执行此操作时,你一次读取一个数据库行,通过网络发送它,等待它来到你的页面,处理它,扔掉它,然后请求下一个。 使用 SQL,所有艰苦的工作都由数据库引擎完成,并且您不会因通过网络传输不必要的数据而浪费时间。 使用上面的第一组表定义,您可以编写
SELECT mentorID, menteeID
FROM MentorRelationship
GROUP BY mentorID, menteeID
HAVING COUNT(*) > 1;
这将返回多次出现的所有(mentorID, menteeID)
对。
一旦你在服务器上有一个这样的查询(并且还提取了你想要向用户显示的所有信息,这可能不仅仅是一对ID(,你需要通过网络将其发送到用户的Web浏览器。 本质上,在服务器端,您映射一个 URL 以某种方便的形式(JSON、XML 等(返回此信息,而在客户端,您可以通过 AJAX 调用联系该 URL 来读取此信息(有关一些代码示例,请参阅 jQuery 的网站(,然后将该信息显示给用户。 无需用 JavaScript 编写数据库引擎的执行速度将快几个数量级。
编辑2:根据第二条评论,检查项目是否已在数据库中
我在第一次编辑中所说的几乎所有内容都适用,除了两个更改:架构和查询。 该架构应该成为我发布的两个架构中的第二个,因为您不希望数据库引擎允许重复项。 此外,查询应该很简单
SELECT COUNT(*) > 0
FROM MentorRelationship
WHERE mentorID = @mentorID AND menteeID = @menteeID;
其中@mentorID
和@menteeID
是用户选择的项目,由查询生成器库而不是字符串串联插入到查询中。 然后,如果项目已在数据库中,服务器将获得一个 true 值,否则将获得一个 false 值。 服务器可以像以前一样通过 AJAX 将其发送回客户端,并且客户端(即您的 JavaScript 页面(可以在项目已在数据库中时提醒用户。
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 谷歌地图需要很长时间才能在ie11中渲染
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 我一直收到的控制台警告是什么?推迟长时间运行的计时器任务以提高滚动的流畅性
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- 如何在长时间执行JavaScript期间显示微调器
- 长时间轮询:每个浏览器中的通知
- 完整日历:如何支持一次点击和不长时间点击
- Javascript时间函数问题
- 如何使用 javascript 停止对 asp.net 进行正在进行的回发(长时间运行的执行)
- 为什么这个 AJAX 调用需要这么长时间
- 为什么函数参数需要这么长时间才能加载
- Javascript 函数需要很长时间才能完成
- JQuery新手:长时间运行的函数需要setTimeout吗
- Javascript:在长时间运行的Javascript函数期间显示Throbber
- 对长时间运行的函数进行DOM刷新
- Javascript -我希望在长时间运行的函数运行之前显示复选框
- 如何在javascript中分解长时间运行的函数,但保持性能
- 如果长时间没有返回响应,如何在node.js中强制请求函数终止
- Javascript模式分解长时间运行的递归函数