Javascript 如何停止react中的递归setTimeout函数(clearTimeout不工作)?

Javascript 如何停止react中的递归setTimeout函数(clearTimeout不工作)?,javascript,reactjs,recursion,settimeout,cleartimeout,Javascript,Reactjs,Recursion,Settimeout,Cleartimeout,谢谢你看这个。我正在使用递归进行api调用,以检查任务状态更新。我上周已经实现了这个功能,它正在工作??不知道为什么它不再存在了。不起作用的条件是,如果状态为失败,它不会清除超时,但会输入条件。。。。超时在函数外部的正确上下文中声明 export async function exponentialBackoff (checkStatus, task_id, timeout, max, delay, callback) { let status = await checkStatus(t

谢谢你看这个。我正在使用递归进行api调用,以检查任务状态更新。我上周已经实现了这个功能,它正在工作??不知道为什么它不再存在了。不起作用的条件是,如果状态为失败,它不会清除超时,但会输入条件。。。。超时在函数外部的正确上下文中声明

export async function exponentialBackoff (checkStatus, task_id, timeout, max, delay, callback) {
    let status = await checkStatus(task_id);
    if (status === "SUCCESS") {
        callback();
    } else {
        if (status === "PENDING") {
            timeout = setTimeout(function() {
                return exponentialBackoff(checkStatus, task_id, timeout, --max, delay * 2, callback);
            }, delay);
        }  else if (status === "FAILURE" || max === 0){
            clearTimeout(timeout);
            return "FAILURE";
        }
    }
}

看起来像是地狱。我强烈建议您避免名称阴影和覆盖参数

另外,我相信如果调用下一个超时,您不想保持前一个超时有效吗

let timeoutInstance;

const clear = (tm) => {
   if (tm) clearTimeout(tm);
};

export async function exponentialBackoff (checkStatus, task_id, max, delay, callback) {
    let status = await checkStatus(task_id);
    if (status === "SUCCESS") {
        callback();
    } else {
        if (status === "PENDING") {
            clear(timeoutInstance);

            timeoutInstance = setTimeout(function() {
                return exponentialBackoff(checkStatus, task_id, --max, delay * 2, callback);
            }, delay);
        }  else if (status === "FAILURE" || max === 0){
            clear(timeoutInstance);

            return "FAILURE";
        }
    }
}

如果您输入“FAILURE”(失败)条件,但
clearTimeout
不起作用,那么这一定意味着您没有向其提供正确的超时ID。。。或者有比你意识到的更多的开始。你可以考虑用这样的东西来清除它们。还可以考虑使用调试器和/或打印一些<代码>控制台。()(代码)>代码>消息。