调用JavaScript setTimeout没有被调用10次

时间:2014-04-28 13:57:38

标签: javascript jquery

我有一个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。它应该返回一个错误。我该怎么做

4 个答案:

答案 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)

除了将timercount设置为全局变量之外,我认为您需要在执行时为inputInner分配值:

                if (!data) {
                    setTimeout(function() {
                      function(inputInner) {
                        CallIsDataReady(inputInner);
                        count++;
                        if (count == 10) {
                            clearInterval(timer);
                            count = 0;
                        }
                      }(input);
                    }, 1000);
                }

答案 3 :(得分:-1)

您似乎尝试使用setTimeout代替setIntervalsetTimeout仅在一定时间后调用一次函数。 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);