2012-01-04 100 views
2

我一直在阅读有关的setInterval和我自己的方式来从一个页面发送多个Ajax请求上来。问题是,一旦我按下按钮1后按下按钮2,它会停止发送多个请求,如果我再次按下按钮1,它不会停止以前的setInterval()并启动并行请求。我试图达到的是,当我按下按钮1时,它必须只打印“1”30次,当我按下按钮2时,它必须停止打印“1”,但在睡眠5秒后打印“2”,如果我按下按钮1,它必须再次开始打印“1”并停止打印“2”。以下是我的代码:与多个AJAX的setInterval发出请求

<script language='javascript'> 
var request = 0; 
var request1 = 0; 
$(document).ready(function() { 
    $("#hi button").click(function() { 

     var id = this.id; 
     if(request!=0){ 
      clearInterval(request); 
      request1.abort(); 
     } 
     request = setInterval(do_it,1000,id);   
    }); 
}); 

function do_it(id) { 
     request1 = $.ajax({ 
     url: "php.php?id=" + id, 
     success: function (result) { 
      $("#result").html(result); 
      } 
     }); 
} 
</script> 

<div class="hi" id="hi"> 
    <button id="1" ></button> 
    <button id="2" ></button> 
    </div> 

<div id="result"></div> 

PHP代码:

<?php 
$word=''; 
include('sql_connect.php'); 
if($_GET['id'] == '1') { 
    $main = '1'; 

    for($i = 0; $i < 30; $i++) { 
     $word .= $main . "<br>"; 
    } 
    echo $word; 
} 

if($_GET['id'] == '2') { 
    $a = 0; 

    while($a != 1) { 
     sleep(5); 
     $a=1; 
    }    
    echo "2"; 
} 
?> 

任何帮助表示赞赏。感谢

+0

你不想'request1.abort()'? – 2012-01-04 22:26:31

+0

对不起,这就是我的原始脚本。还是同样的问题 – zista 2012-01-04 22:28:57

回答

1

当设定的setInterval函数,该函数必须包含在引号包裹,也可以使用匿名函数(下面的例子是在引号包裹)。 另外,您正在为setInterval指定不正确的第三个参数。

setInterval中的第三个参数是: Lang:用于指定脚本语言的可选参数,例如:Jscript,Javascript,vbscript。

setInterval(do_it, 1000, id); 

应该

setInterval('do_it(' + id + ')', 1000); 
+1

也可以,你可能想在客户端做5秒延迟。按照书面的说法,你的服务器代码对于每个接收到id = 2的ajax调用都会暂停5秒,并且由于你的javascript一直在发送id = 2的很多ajax消息,所以这个消息会得到真正快速的备份。 $ a在发送到php脚本的后续请求中不保留它的值,或者你在这里想到的任何东西。 – dqhendricks 2012-01-04 23:28:49

+0

我试过了,现在它不打印任何东西。当我做alert(id); (在“函数do_it(id){”之后)它表示[对象HTML按钮元素]。这意味着它没有正确传递参数。 – zista 2012-01-05 04:39:01

0

我不是太熟悉的jQuery(我只是使用JavaScript开箱),但我已经讨论了使在过去的定时循环Ajax调用。有一点要考虑的是,如果你正在AJAX的异步调用,那么的setInterval/setTimeout的将继续无论运行,如果前面的Ajax响应被称为(除非如果你打电话的setTimeout的响应函数,那么AJAX请求和响应调用将同步运行)。或者,你可以做syncronous Ajax调用 - 如果是有道理的

0

您必须分配的clearInterval()request输出所以它不再次命中if声明:request = clearInterval(request); - 这将导致request等于undefined,因此我不会“T在上面指定的变量,这样做:

var request; 
var request1; 

... 

if(request) {...} 

也为Im相当肯定的setInterval()是第三个参数是你不希望传递给你定义的函数arguements - 你会做的是这样的:

setInterval(function() { 
    do_it(id); 
}, 1000); 

http://www.w3schools.com/jsref/met_win_setinterval.asp

+1

'(callback,delay [,additional-params])'是'setInterval'的有效语法选项,但它在IE中不起作用。 – Aaron 2012-01-04 22:51:48

+0

'request'的值已经在'if'语句之外重新分配。 – 2012-01-04 22:59:14

0

看看上面的回答帮我找到一个很好的解决方案。这是我做过什么:

request1 = $.ajax({ 

url: "php.php?id=" + id, 
success: function (result) { 
    $("#result").html(result); 
    do_it(id); 
} }); 


function do_it(id) { 
     //alert(id); 
     request1 = $.ajax({ 
     url: "php.php?id=" + id, 
     success: function (result) { 
      $("#result").html(result); 
      request = setTimeout(do_it,1000,id); 
      } 
     }); 
} 

虽然使用的setTimeout( 'do_it(' + ID + ')',1000)妥善我仍然无法传递参数; ,它为我工作。

0

使用的setTimeout下列方式

setTimeout(function(){ 
     do_it(id); 
    }, 1000);