【发布时间】: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