【问题标题】:Javascript setTimeout/clearTimeout weird behavior in electron电子中的Javascript setTimeout / clearTimeout奇怪行为
【发布时间】:2017-10-19 22:42:21
【问题描述】:

我正在构建一个加载页面并在页面加载后对页面进行一些测试的电子应用程序。我想在页面加载时强制超时,所以如果页面没有加载,假设 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”并同步发回一条消息。

在大多数情况下,这段代码可以工作:当页面在 5 秒后没有完成加载时,它会移动到下一个 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

我预计clearTimeout 会在我发出进行测试的请求之前删除超时功能,因此done test urla 永远不会在urla timed out 输出之后发生。怎么回事?

【问题讨论】:

    标签: javascript timeout settimeout electron


    【解决方案1】:

    您的计时器变量未定义。

    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';
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2021-07-18
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多