如何解决这个ReferenceError?

时间:2012-11-22 19:43:44

标签: javascript jquery

我有一个基于Django的Web应用程序。我使用Scrapy Crawler抓取网页。我目前的目标是能够使用jQuery和AJAX请求从网页中控制抓取工具。

我的理论设置如下:

  • 在网页上,我有一个按钮。单击按钮时,将在服务器端启动爬网程序。
  • 抓取工具启动后,我会定期使用window.setInterval向服务器发送AJAX GET请求,以了解到目前为止已抓取了多少网页。
  • 抓取工具完成后,应使用window.clearInterval停止GET请求。

这些是我当前代码中的相关行:

$(document).ready(function() {

    // This variable will hold the ID returned by setInterval
    var monitorCrawlerId;

    $startCrawlerButton.on('click', function(event) {

        // This function should be run periodically using setInterval
        var monitorCrawler = function() {

            $.ajax({

                type: 'GET',
                url: '/monitor_crawler/',
                // ...
                success: function(response) {

                    // if the server sends the message that the crawler
                    // has stopped, use clearInterval to stop executing this function
                    if (response.crawler_status == 'finished') {

                        clearInterval(monitorCrawlerId);

                    }

                } 

            });

        };

        // Here I send an AJAX POST request to the server to start the crawler
        $.ajax({

            type: 'POST',
            url: '/start_crawler/',
            // ...
            success: function(response) {

                // If the form that the button belongs to validates correctly,
                // call setInterval with the function monitorCrawler defined above
                if (response.validation_status == 'success') {

                    monitorCrawlerId = setInterval('monitorCrawler()', 10000);

                }

            }

        });

    });
});

问题:当我执行此代码时,我会在Firefox的Web控制台中看到它:

ReferenceError: monitorCrawler is not defined
然而,奇怪的是,函数monitorCrawler无论如何都会定期执行。但是每次执行时,我都会再次收到相同的错误消息。如果我将monitorCrawler放在$startCrawlerButton.on()之外,我仍然会遇到相同的错误。我该如何解决这个问题?由于我是一个JavaScript新手,任何帮助表示赞赏。非常感谢你!

3 个答案:

答案 0 :(得分:3)

setInterval,当第一个参数是字符串时,在全局(window)上下文中解析。你可以给它一个指向要调用的函数的变量,甚至:

setInterval(function(){monitorCrawler();}, 10000);

这将创建一个闭包,当间隔触发时,局部变量monitorCrawler仍然存在。

答案 1 :(得分:2)

更改

setInterval('monitorCrawler()', 10000);

setInterval(monitorCrawler, 10000);

永远不要将字符串传递给setInterval,而是函数引用!它们每次都会eval,并且在全局范围内 - 但是你的monitorCrawler函数是点击处理程序的本地函数(我想通过“把它放在外面”你的意思是“准备好” - 回调“)。

答案 2 :(得分:1)

尝试

monitorCrawlerId = setInterval(monitorCrawler, 10000);

带参数:

monitorCrawlerId = setInterval(function(){
      //prepare params.
      monitorCrawler(/* param1, param2*/);
   }, 10000);