[英]Call to JavaScript setTimeout not being called 10 times
我有一个JavaScript / jQuery代码函数,如果没有可用数据(由Web服务调用确定),则该函数最多可以调用十次。 我已经实现了代码,但是Web服务调用中的日志记录表明它仅被调用1次或2次。 这段代码有什么错误?
function CallIsDataReady(input) {
var timer;
var count = 0;
$.ajax({
url: "https://www.blah.com/services/TestsService.svc/IsDataReady",
type: "GET",
contentType: "application/json; charset=utf-8",
data: input,
success: function (data) {
if (!data) {
setTimeout(function(inputInner) {
CallIsDataReady(inputInner);
count++;
if (count == 10) {
clearInterval(timer);
count = 0;
}
}, 1000);
} else {
console.log("data returned - returning true");
//Continue as data is ready
var tableView = $find("<%= RadGrid1.ClientID %>").get_masterTableView();
GetDataFromServer(0, tableView.get_pageSize());
}
},
error: function (jqXHR, textStatus, errThrown) {
console.log("AJAX call failed in CallIsDataReady");
console.log(errThrown);
}
});
}
编辑:它应该尝试最多十次,然后退出,而不要继续GetDataFromServer。 它应该返回一个错误。 我该怎么办 ?
每次调用CallIsDataReady
时CallIsDataReady
重置count
。
更换:
function CallIsDataReady(input) {
var timer;
var count = 0;
附:
var count = 0;
function CallIsDataReady(input) { // You won't need the `timer` variable
这将在首次调用CallIsDataReady
之前将count
设置为0
。 然后,每次通话, count
都会增加。
现在,要正确处理该计数器,请替换:
if (!data) {
setTimeout(function(inputInner) {
CallIsDataReady(inputInner);
count++;
if (count == 10) {
clearInterval(timer);
count = 0;
}
}, 1000);
附:
if (!data && count !== 10) {
setTimeout(function(input) {
CallIsDataReady(input);
count++;
}, 1000);
现在,我不确定应该使用哪个inputInner
,因此我将其替换为input
。 如果要将其他变量传递给后续调用,则必须为inputInner
分配一个值。
setTimeout用于触发一次函数调用,并且只能触发一次 。
如果您希望此操作有效,请从超时的回调中重复调用setTimeout:
function CallIsDataReady(input) {
var timer;
var count = 0;
function callWebService(){
console.log('calling webservice');
$.ajax({
url: "https://www.blah.com/services/TestsService.svc/IsDataReady",
type: "GET",
contentType: "application/json; charset=utf-8",
data: input,
success: function (data) {
console.log('count = ' + count);
console.log('data = ' + data);
if (!data){
if(count < 10) {
count++;
setTimeout(callWebService, 1000);
} else {
count = 0;
}
}else{
console.log("data returned - returning true");
//Continue as data is ready
var tableView = $find("<%= RadGrid1.ClientID %>").get_masterTableView();
GetDataFromServer(0, tableView.get_pageSize());
}
},
error: function (jqXHR, textStatus, errThrown) {
console.log("AJAX call failed in CallIsDataReady");
console.log(errThrown);
}
});
};
callWebService();
}
除了使timer
和count
成为全局变量外,我认为您还需要在执行时为inputInner
分配一个值:
if (!data) {
setTimeout(function() {
function(inputInner) {
CallIsDataReady(inputInner);
count++;
if (count == 10) {
clearInterval(timer);
count = 0;
}
}(input);
}, 1000);
}
看来您正在尝试使用setTimeout
而不是setInterval
。 setTimeout
调用仅在一定时间后才起作用。 setInterval
将按间隔调用函数,直到您调用clearInterval
为止。
http://www.w3schools.com/jsref/met_win_setinterval.asp
timer= setInterval(function(inputInner) {
CallIsDataReady(inputInner);
count++;
if (count == 10) {
clearInterval(timer);
count = 0;
}
}, 1000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.