setInterval每次触发两次Ajax调用。

6

我有以下JS代码:

var delay = 5000;

function init() {
    setInterval(getFileCount, delay);
}

function getFileCount() {
    $.get('/notification/course-file-count', function(response) {
        if (response.items.length === 0) {
            return false;
        }

        // Do stuff with response
    });
}

在页面加载时,我调用了 init() 函数。其想法是开始间隔并每5秒钟调用一次 getFileCount() 函数。
因此,间隔在页面加载后等待5秒并运行,但它总是会发出两次 Ajax 调用
我错过了什么? 更新: 我知道在页面加载时会触发 init() 函数两次(感谢 Yury Tarabanko 的评论)。我不太明白为什么。几乎完整的代码:
$(function() {
    'use strict';

    function handleCourseNotification() {

        var delay = 5000;

        function init() {
            setInterval(getFileCount, delay);
        }

        function getFileCount() {
            $.get('/notification/course-file-count', function(response) {
                if (response.items.length === 0) {
                    return false;
                }

                updateCourseList(response.items);
            });
        }

        function updateCourseList(items) {
            // update course list...
        }

        return {
            init: init
        };

    }

    if ($('#js-auth-course-list').length) {
        var notificationHandler = handleCourseNotification();
        notificationHandler.init();
    }

});

这是一个小模块,我在页面加载后进行初始化,如果DOM中存在特定的元素 - $('#js-auth-course-list')。为什么实际上要调用2次init?我只直接调用一次。


5
我猜你调用了两次初始化函数 :) - Yury Tarabanko
你能展示一下调用init()函数的代码吗? - singe batteur
@YuryTarabanko 我调用了两次,哦天啊。谢谢。 - lesssugar
var init = function(){setInterval(getFileCount, delay); init = function(){thrown new Error('Oh, no way I did it twice')};} 尝试一下 :) - Yury Tarabanko
请尝试这个 JSFiddle:https://jsfiddle.net/adminsunil/mwkL67ge/ - Sunil Kumar
显示剩余6条评论
1个回答

5
一般来说,在setInterval()内部调用异步调用不是一个好主意,因为你不知道确切的响应时间。所以,你可能会在第一个调用的响应返回之前调用第二个异步函数。
你可以尝试使用setTimeout()来实现:
var delay = 5000;
var async = function() {
   $.get('/notification/course-file-count', function(response) {
      if (response.items.length === 0) {
         return false;
      }
      // Do stuff with response

      // Call the async function again
      setTimeout(function() {
        async();
      }, delay);
   });
}

async();

如果我没记错的话,setTimeOut只会执行一次,而他想每5秒执行一次。 - Luis Cardenas
1
是的,但在异步成功后,它会在5秒后再次调用自身。因此,这是一个无限循环。 - kapantzak
1
这不是关于上述问题的答案或解决方案。 - Amit Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接