我有一个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。它应该返回一个错误。我该怎么做?
答案 0 :(得分:1)
count
时都会重置 CallIsDataReady
。
替换:
function CallIsDataReady(input) {
var timer;
var count = 0;
使用:
var count = 0;
function CallIsDataReady(input) { // You won't need the `timer` variable
这会在第一次调用count
之前将0
设置为CallIsDataReady
。然后,每次调用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
分配值。
答案 1 :(得分:1)
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();
}
答案 2 :(得分:0)
除了将timer
和count
设置为全局变量之外,我认为您需要在执行时为inputInner
分配值:
if (!data) {
setTimeout(function() {
function(inputInner) {
CallIsDataReady(inputInner);
count++;
if (count == 10) {
clearInterval(timer);
count = 0;
}
}(input);
}, 1000);
}
答案 3 :(得分:-1)
您似乎尝试使用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);