2015-01-04 22 views
6

我只是好奇CasperJS如何處理與調用堆棧有關的事件。然後CasperJs()是否等待上一個函數中發出的事件?

比方說,我們有一些代碼:

casper.on('foo', function() { 
    this.wait(60000); 
    this.echo('foo'); 
}); 


casper.start('http://www.stackoverflow.com', function() { 
    this.echo('start'); 
    this.emit('foo'); 
}); 


casper.then(function() { 
    this.echo('done'); 
}); 

casper.run(); 

我知道,那麼()將等待覈對3 flags:pendingWait,loadInProgress和navigationRequested。打印調用堆棧顯示emit函數在函數start()中,那麼start()不會被視爲完成,直到事件結束?即然後將()等待,直到事件結束

我60秒的等待測試這一點,我沒有得到的輸出:

start 
foo 
done 

雖然我不知道,如果超過一定的超時將觸發然後()。

回答

3

你必須記住哪些函數是異步執行的。在你的情況下,輸出的前兩行在加載頁面時立即打印,並且在60秒後打印出done

事項:

  • 所有then*wait*功能將插入步到隊列中,但本身是異步的。
  • casper.emit將查找註冊的事件處理程序並立即執行它(非異步)。
  • ​​將立即打印某些內容(非異步)。

事件的順序是,在start回調,這本身就是一個階梯函數,則觸發事件並立即執行。此執行的事件包含一個wait調用,它在當前調用之後添加一個延遲步驟(我們仍在start回調中)。然後執行echo並完成當前步驟。下一步開始等待60秒。由於沒有回調傳遞給wait,所以執行下一個管理步驟。這是包含echo('done')的最後一步。

所以嚴格地說then不會等待上一步驟的事件執行,但在這種情況下沒有打出來的控制流(通常是通過setTimeout完成)和CasperJS分步處理器已經引起了內部wait步。

+0

非常徹底,謝謝你的迴應!如果我用一些花費一些時間的非異步邏輯取代了等待語句,我是否仍然期望相同的輸出?根據我的理解,一旦最後一個非異步狀態結束(即使該語句在某些情況下),開始回調就會結束,然後()不會在該點之前執行。 –

+1

你的觀察是正確的,輸出將是相同的,但時間會有所不同,因爲現在阻塞的等待在'this.echo('foo')之前;'' –

相關問題