1

DjangoをベースにしたWebアプリケーションがあります。ScrapyCrawlerを使用してWebページをクロールします。現時点での私の目標は、jQueryおよびAJAXリクエストを使用してWebページ内からクローラーを制御できるようにすることです。

私の理論的な設定は次のとおりです。

  • ウェブページにボタンがあります。ボタンをクリックすると、サーバー側でクローラーが起動します。
  • window.setIntervalクローラーが起動したら、これまでにクロールされたWebページの数を確認するために、定期的にAJAXGETリクエストをサーバーに送信します。
  • クローラーが終了したら、GETリクエストはを使用して停止する必要がありますwindow.clearInterval

これらは私の現在のコードからの関連する行です:

$(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の初心者なので、どんな助けでも大歓迎です。どうもありがとうございます!

4

3 に答える 3

3

setInterval、最初のパラメーターが文字列の場合、グローバル ( window) コンテキストで解決されます。呼び出される関数を指す変数を指定することも、次のようにすることもできます。

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

monitorCrawlerこれにより、間隔が発生したときにローカル変数がまだ存在するクロージャーが作成されます。

于 2012-11-22T19:51:10.430 に答える
2

変化する

setInterval('monitorCrawler()', 10000);

setInterval(monitorCrawler, 10000);

文字列を に渡すことは決してありませんsetIntervalが、関数参照です! それらはeval毎回 ed になりますが、それはグローバル スコープにありますが、monitorCrawler関数はクリック ハンドラーに対してローカルです (そして、「外部に配置する」ということは、「レディ コールバックに入れる」ことを意味していると思います)。

于 2012-11-22T19:48:47.200 に答える
1

試す

monitorCrawlerId = setInterval(monitorCrawler, 10000);

パラメータ付き:

monitorCrawlerId = setInterval(function(){
      //prepare params.
      monitorCrawler(/* param1, param2*/);
   }, 10000);
于 2012-11-22T19:47:26.727 に答える