javascript - 确保一次只有一个 setTimeout 运行(处于事件状态)?

标签 javascript recursion global-variables settimeout function-call

递归的setTimeout函数getRandomProducts在html body标签中调用onload,不断迭代。

函数setCategoryTree正在被调用从导航栏的嵌套 ul 中的链接调用 onclick此函数然后将变量 mainCategory 传递给 getRandomProducts,其中全局声明变量以保持其初始化。

...所以,我要做的是单击导航栏中的链接时重置 getRandomProducts 函数,并从单击的链接传递类别名称。然而,clearTimeout 似乎不起作用,因此迭代发生得更频繁,因为那时有多个递归循环同时执行。

不仅如此,我的全局变量也没有按预期存储来自 setCategoryTree 的数据(基本上我试图以类似于静态变量的方式使用全局变量)。我已经通过注释掉的 window.alert 识别出所有这些行为。

这是相关的 Javascript 代码:

var mainCategory = ""; // initialized from setCategoryTree
var category = mainCategory;

function getRandomProducts(category)
{
    //window.alert(category);
    if(typeof category == "undefined")
        category = "all";
    else
        clearTimeout(t);

    var req = new XMLHttpRequest();

    var products = document.getElementById("products");

    req.onreadystatechange = function()
    {
        if( (req.readyState == 4) && (req.status == 200) )
        {
            var result = req.responseText;
            products.innerHTML = result;
        }
    }
    req.open("GET", "default.php?category=" + category, true);
    req.send(null);

    var t = setTimeout("getRandomProducts()", 1000);
}

function setCategoryTree(link)
{
    var categoryTree = document.getElementById("categoryTree");

    /* climbing the DOM-tree to get the category name (innerHTML of highest "a" tag) */
        mainCategory = link.parentNode.parentNode.parentNode.getElementsByTagName("a")[0].innerHTML;

    var subcategory = link.innerHTML;

    categoryTree.innerHTML = "-- " + mainCategory + "  -- " + subcategory;

    getRandomProducts(mainCategory);
}

最佳答案

您正在函数中设置变量 t。下次调用此函数时,您将无法使用 var t

因此,将变量设置在函数之上(不在函数中)

var randomProductsTimeout = false;

function getRandomProducts(category){

    randomProductsTimeout = setTimeout()[..]

关于javascript - 确保一次只有一个 setTimeout 运行(处于事件状态)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10084794/

相关文章:

javascript - IE : "Function expected"start() '<input onclick=" 中的错误 ;"... '

javascript - 渲染时出现 React Context 错误

Typescript - 类型安全深度省略,或 : how to list legal object paths

c - 为什么不能为 Linux 非阻塞套接字递归调用 'select'

javascript - vars 存储在 Nodejs 中的什么位置?

c++ - C++中如何通过 "global"获取一个 `extern`类对象

javascript - 如何使用 jquery $(this) 提供 js 函数

javascript - jsTree 在创建节点后获取新节点

c++ - 用 10 个板递归 c++ 解决汉诺塔

python - 在 python 中将变量写入 txt 会引发一些错误