我有一个基于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新手,任何帮助表示赞赏。非常感谢你!
答案 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);