2017-05-19 8 views
0

私は、ページを読み込んで、ページが読み込まれた後、あるページで何らかのテストを行う建物と電子アプリです。ページの読み込みにタイムアウトを強制したいので、ページが読み込まれなかった場合は5秒後に次の項目に移動しましょう。Javascript setTimeout/clearTimeout電子の奇妙な振る舞い

私のコードは私のメインの過程でこのようなものです:

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 
... 

、それができますこのような出力OUT:

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

私はテストを実施するための要求を送信する前にdone test urlaurla timed out出力した後に発生しませんので、タイムアウト機能を削除しますclearTimeoutを期待しました。どうしたの?

答えて

0

あなたのタイマー変数は未定義です。

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