繁体   English   中英

调用JavaScript setTimeout不会被调用10次

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

每次调用CallIsDataReadyCallIsDataReady重置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();
}

除了使timercount成为全局变量外,我认为您还需要在执行时为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM