如何使用带有递归的setTimeout来等待在JavaScript中定义变量?

如何使用带有递归的setTimeout来等待在JavaScript中定义变量?,javascript,jquery,Javascript,Jquery,我想等到storage.get('session')=空,然后执行回调 我遇到的问题是我的递归setTimeout方法以指数方式运行,而不是每秒检查变量是否定义一次 结果是waitForElement每秒执行数千次,这是我不希望看到的。。我希望它每1秒执行一次,直到storage.get('session')=空 waitForElement(function(){ console.log("DONE!"); }); function waitForElement(callback){

我想等到
storage.get('session')=空
,然后执行
回调

我遇到的问题是我的递归
setTimeout
方法以指数方式运行,而不是每秒检查变量是否定义一次

结果是waitForElement每秒执行数千次,这是我不希望看到的。。我希望它每1秒执行一次,直到
storage.get('session')=空

waitForElement(function(){
    console.log("DONE!");
});

function waitForElement(callback){
    if(storage.get('session')!=null)
    {
        console.log("session exists now");
        if(typeof callback=="function")
        {
            callback();
        }
    }
    else
    {
        console.log("session still does not exist. Checking again in 1 second");

        //ISSUE: THIS RUNS IMMEDIATELY AND FOREVER!
        setTimeout(waitForElement(function(cb){
                if(typeof cb == "function"){
                    cb();
                }
        }), 1000);
    }
}

这是因为在设置超时时,您会立即调用函数
waitForElement
。试试这个

var callback = function(cb){
    if(typeof cb == "function"){
        cb();
    }
}

setTimeout(waitForElement.bind(this, callback), 1000);

您立即致电waitForElement。您需要传递一个函数引用,它基本上是一个没有“()”的函数名。鉴于您的函数没有“this”,因此无需担心这种情况下的上下文

setTimeout(function() {
    waitForElement(function(cb){
        if(typeof cb == "function"){
            cb();
        }
    });
}, 1000);

另外需要注意的是,您从不向回调函数传递任何内容。

您根本不应该使用超时-承诺是目前这种异步处理的首选模型,例如

function login() {
    return new Promise((resolve, reject) => {
        // do something that creates the session
        if (successful) {
            resolve();
        } else {
            reject();
        }
    })
}

// promise that will eventually be resolve when the user logs in
var loggedIn = login();

// multiple (potentially parallel) actions
loggedIn.then(doSomething);
loggedIn.then(doSomethingElse);

// serial actions
loggedIn.then(doFirstThing).then(doSecondThing);

是什么将该变量放入
存储器中的?
?嘿@Alnitak!有一个
登录
功能将其放入存储。我遇到的问题是,多个函数正在等待
login
完成,但我不希望
login
被多次调用。所以,如果它被调用过一次,那么等待它定义“会话”。其他调用它的人都将等待登录设置会话。这是承诺要用于的异步情况。显示存储的示例代码。get()您有一个XY问题-在我看来,您应该使用承诺,而不是轮询。不要使用超时轮询。只需进入
窗口。onstorage
事件!