2017-05-19 1 views
0

Ich bin Gebäude-und Elektronen-App, die eine Seite lädt und einige Tests auf einer Seite durchführen, sobald die Seite geladen ist. Ich möchte eine Zeitüberschreitung beim Laden der Seite erzwingen, sagen wir also nach 5 Sekunden, wenn die Seite nicht geladen wird, gehen Sie zum nächsten Element.Javascript setTimeout/clearTimeout seltsames Verhalten in Elektron

Mein Code ist so etwas wie dies in meinem Haupt-Prozess:

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

Und in meinem Prozess machen, gibt es ein Zuhörer, die zu ‚dotext‘ hört und wird synchron eine Nachricht schicken.

Für den größten Teil dieser Code Arbeit: wenn die Seite nach 5s nicht Last beenden, bewegt er sich auf die nächste URL und Ausgang korrekte Nachricht wie folgt aus:

url1 
url1 timed out 
url2 
done test url2 
url3 
url3 timed out 
... 

jedoch gelegentlich, es gibt out-Ausgang wie folgt aus:

urla 
urla timed out 
urlb 
done test urla 
done test urlb 
urlc 
done test urlc 

erwartete ich die clearTimeout würde die Timeout-Funktion entfernen, bevor ich die Anforderung auszusenden Test durchführen, so sollte die done test urla nie nach urla timed out Ausgang passieren. Was ist los?

Antwort

0

Ihre Timer-Variable ist nicht definiert.

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