Javascript函数需要太长时间才能完成?

Javascript函数需要太长时间才能完成?,javascript,Javascript,下面是我遇到麻烦的代码片段。其目的是检查数据库中的重复条目,如果为true或false,则返回带有布尔值的“h”。出于测试目的,我将返回一个“h”的真布尔值,但在警报发出时(重复计数);执行第行时,重复计数仍然为0。即使+1的警报已执行 在我看来,函数updateUserFields的执行时间似乎更长,因此在到达警报之前完成它的时间也更长 有什么想法或建议吗?谢谢 var duplicate_count = 0 for (var i = 0; i < skill_id.length; i

下面是我遇到麻烦的代码片段。其目的是检查数据库中的重复条目,如果为true或false,则返回带有布尔值的“h”。出于测试目的,我将返回一个“h”的真布尔值,但在警报发出时(重复计数);执行第行时,重复计数仍然为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);
var重复计数=0
对于(变量i=0;i
没有任何理由使用客户端JavaScript/jQuery从数据库中删除重复项。除了安全问题(还有很多安全问题),还有一种更简单的方法可以确保数据库中的条目是唯一的:使用SQL

SQL能够表达表列中不存在重复项的要求,数据库引擎将为您强制执行该要求,而不会让您首先插入重复项。数据库引擎的语法差别很小,但无论何时创建表,都可以指定列必须是唯一的

让我们将其用作示例数据库引擎。您的问题的相关部分现在可能用如下表格表示:

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)
对更改为主键,您可以强制唯一性,即要求任何
(menterid,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;
它将返回所有出现多次的
(menterid,menteeID)

一旦您在服务器上有了这样一个查询(同时也提取出您想要向用户显示的所有信息,这可能不仅仅是一对ID),您需要通过网络将其发送到用户的web浏览器。本质上,在服务器端,您映射一个URL,以某种方便的形式(JSON、XML等)返回此信息,在客户端,您通过AJAX调用联系该URL来读取此信息(参见一些代码示例),然后将该信息显示给用户。无需用JavaScript编写数据库引擎执行速度快几个数量级的代码


编辑2:根据第二条注释,检查数据库中是否已存在项目

我在第一次编辑中所说的几乎所有内容都适用,除了两个更改:模式和查询。该模式应该成为我发布的两个模式中的第二个,因为您不希望数据库引擎允许重复。此外,查询应该是简单的

SELECT COUNT(*) > 0
FROM MentorRelationship
WHERE mentorID = @mentorID AND menteeID = @menteeID;

其中,
@mentoid
@menteeID
是用户选择的项目,并由查询生成器库和数据库插入查询中。然后,如果该项已经在数据库中,服务器将获得一个真值,否则将获得一个假值。服务器可以像以前一样通过AJAX将其发送回客户端,客户端(这是您的JavaScript页面)可以在项目已经在数据库中时提醒用户。

为什么要使用JavaScript进行数据库逻辑?我让Coldfusion处理db查询,但是我们使用的JQuery需要从查询返回的字段。如果循环执行时间过长,它将触发此浏览器警报。对于这种要求很高的循环,最好使用计时器,以避免阻塞浏览器主线程。使用imers需要更长的时间,但是主线程会有响应……您应该考虑使用ajax调用,当它返回时,您可以决定是否显示警报。这样,如果需要3秒或30秒,则在服务器完成检查之前,不会执行警报逻辑。是否由_relationship _duplicate负责调用回调?我不清楚。这种方法似乎并不合理。您正在启动一系列异步调用,而不是等待它们全部完成。然后尝试立即读取结果。在循环之后,您需要某种类型的同步。我没有删除重复项,如果存在重复项,我需要向用户发出警报。我同意您的建议,您可能需要更多的回溯信息来理解。我有一个用户从项目列表中选择技能,在保存他们的技能之前,我想检查数据库,看看他们之前是否已经输入了这些技能。如果他们这样做了,我会提示他们做出不同的选择。如果没有,则将其保存到数据库中。希望这能澄清一些问题;)@布莱恩“理解”有点有钱。我理解您写的内容,但您写的是检查重复项,而不是在插入前检查数据库中是否已存在项。尽管如此,我还是再次编辑以回答您的问题