强力循环冻结浏览器;如何让服务器做到这一点?

时间:2013-04-04 14:00:14

标签: javascript for-loop client-server

基本概要;我正在检索约100个Facebook状态,并搜索这些帖子以检查它是否包含约20个搜索词之一。当我尝试在浏览器中运行它时它会锁定,这让我很担心尝试在客户端运行它。

让服务器运行此操作并返回结果的最简单方法是什么?我可以用Python做吗?这是循环,供参考。

    function Filter() {
    console.log("running Filter")
    //loop through fbObj.posts
    for (i = 0, l = fbObj.length; i < l; i++){
        var post = fbObj[i].post
        console.log("Checking " + post + " for search terms")
        //loop through searchTerms
        for (j = 0; j<searchTermObj.length; j= j++) {
            searchTerm_variants = searchTermObj[j].words
            for (x = 0; x <  searchTerm_variants.length; x++){
                if (post.indexOf(searchTerm_variants[x]) !== 0){
                    foundPosts[i] = {}
                    foundPosts[i] = fbObj[i]
                }
            }   
        }
    console.log(foundPosts) 
    }
}

3 个答案:

答案 0 :(得分:2)

您的代码中有错误可能解释了锁定:

//loop through searchTerms
for (j = 0; j<searchTermObj.length; j= j++) {

j永远不会增加(因此它始终为0):

j ++增加j,但求值为j,分配给j。所以这是一个空操作。

因此,您的代码会陷入循环中。

答案 1 :(得分:1)

您是否考虑过使用工作线程在客户端上执行此操作?但是,这可能只在各种浏览器的最新版本中可用? https://developer.mozilla.org/en-US/docs/DOM/Worker

答案 2 :(得分:1)

我认为你可以构建一个像这样无所不包的正则表达式:

var regexWords = [], variants;
for (var i = 0; i < searchTermObj.length; ++i) {
  variants = searchTermObj[i].words;
  for (var j = 0; j < variants.length; ++j)
    regexWords.push(variants[j]);
}

var regex = new RegExp(regexWords.join("|"));

然后你可以像这样测试每个帖子:

for (i = 0, l = fbObj.length; i < l; i++){
    var post = fbObj[i].post
    if (regex.test(post)) {
      // found a naughty word in the post
    }
}

现在只要您的单词列表只是字母单词,就没有像“*”或“。”这样的有趣字符,这就行了。在他们中。

,如果它们确实包含特殊字符,你仍然可以使它工作。但是它会更复杂。

使用像这样的大正则表达式允许正则表达式引擎采用智能子线性搜索技术,因此每个帖子只需要搜索一次。它仍然可能不会非常快。