2017-05-19 3 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'에 수신 및 동 기적으로 메시지를 다시 보내드립니다 리스너있다 :

내 코드 내 주요 프로세스의이 같은 것입니다.

대부분의 경우

에게,이 코드 작업 :

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

그러나, 때때로, 그것은 제공 : 페이지가 5 초 후 부하를 완료하지 않은 경우,이 같은 다음 URL 및 출력 올바른 메시지로 이동 이 같은 출력에서 ​​:

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