Javascript setTimeout/clearTimeout在electron中的奇怪行为

Javascript setTimeout/clearTimeout在electron中的奇怪行为,javascript,timeout,settimeout,electron,Javascript,Timeout,Settimeout,Electron,我正在构建一个加载页面的电子应用程序,并在页面加载后对页面进行一些测试。我想在页面加载上强制一个超时,所以假设在5秒钟后,如果页面未加载,则转到下一项 我的代码在我的主流程中是这样的: var timer; var urls = [...]; var win = new BrowserWindow({...}); var myURL = ""; var setTimer = function (){ timer = setTimeout(()=>{ consol

我正在构建一个加载页面的电子应用程序,并在页面加载后对页面进行一些测试。我想在页面加载上强制一个超时,所以假设在5秒钟后,如果页面未加载,则转到下一项

我的代码在我的主流程中是这样的:

var timer;
var urls = [...];

var win = new BrowserWindow({...});
var myURL = "";

var setTimer = function (){
    timer = setTimeout(()=>{
        console.log(myURL + " timed out");
        loadNext();
    }, 5000);
}

var loadNext = function(){
    if (urls.length > 0){
        timer = setTimer();
        myURL = urls.pop();
        console.log(myURL);
        win.loadURL(myURL;
    }   
}

win.webContent.on('did-finish-load', () => {
    clearTimeout(timer);
    browserWindow.webContents.send('doTest');
})

ipcMain.on('testResult', (event, data) => {
    console.log('done test ' + data);
    event.returnValue = 'yay';
})
在我的渲染过程中,有一个侦听器侦听“doTest”,并将同步发送回消息

在大多数情况下,这段代码是有效的:当页面在5s后没有完成加载时,它会移动到下一个URL并输出正确的消息,如下所示:

url1
url1 timed out
url2 
done test url2
url3
url3 timed out 
...
urla
urla timed out
urlb
done test urla
done test urlb
urlc
done test urlc
但是,有时,它会给出如下输出:

url1
url1 timed out
url2 
done test url2
url3
url3 timed out 
...
urla
urla timed out
urlb
done test urla
done test urlb
urlc
done test urlc

我希望
clearTimeout
会在我发出执行测试的请求之前删除超时功能,因此
done test urla
不应该在
urla超时
输出之后发生。发生了什么事?

您的计时器变量未定义

var timer;
    var urls = [...];

    var win = new BrowserWindow({...});
    var myURL = "";

    var setTimer = function (){
        //Missing return statement
        timer = setTimeout(()=>{
            console.log(myURL + " timed out");
            loadNext();
        }, 5000);
    }

    var loadNext = function(){
        if (urls.length > 0){
            //Following line sets timer to undefined:
            //timer = setTimer(); (comment it out)
            //change to:
            setTimer();
            myURL = urls.pop();
            console.log(myURL);
            win.loadURL(myURL; //Also don't forget to fix this)
        }   
    }

    win.webContent.on('did-finish-load', () => {
        clearTimeout(timer);
        browserWindow.webContents.send('doTest');
    })

    ipcMain.on('testResult', (event, data) => {
        console.log('done test ' + data);
        event.returnValue = 'yay';
    })

您的计时器变量未定义

var timer;
    var urls = [...];

    var win = new BrowserWindow({...});
    var myURL = "";

    var setTimer = function (){
        //Missing return statement
        timer = setTimeout(()=>{
            console.log(myURL + " timed out");
            loadNext();
        }, 5000);
    }

    var loadNext = function(){
        if (urls.length > 0){
            //Following line sets timer to undefined:
            //timer = setTimer(); (comment it out)
            //change to:
            setTimer();
            myURL = urls.pop();
            console.log(myURL);
            win.loadURL(myURL; //Also don't forget to fix this)
        }   
    }

    win.webContent.on('did-finish-load', () => {
        clearTimeout(timer);
        browserWindow.webContents.send('doTest');
    })

    ipcMain.on('testResult', (event, data) => {
        console.log('done test ' + data);
        event.returnValue = 'yay';
    })