2015-01-04 5 views
6

मैं सिर्फ उत्सुक हूं कि कैसे कॉलरजेएस कॉल स्टैक के संबंध में घटनाओं को संभालता है।क्या कैस्परजेएस() पिछले कार्य में उत्सर्जित घटनाओं पर प्रतीक्षा करते हैं?

मान लें कि हम कुछ कोड है:

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। कॉल स्टैक को प्रिंट करना, उत्सर्जन कॉल को फ़ंक्शन स्टार्ट() में होने के लिए दिखाता है, इसलिए शुरू हो जाएगा() ईवेंट समाप्त होने तक समाप्त नहीं किया जाएगा? अर्थात। तो() जब तक घटना

समाप्त हो गया है इंतजार करेंगे मैं 60 सेकंड के इंतजार के साथ इस परीक्षण किया है, और मैं आउटपुट प्राप्त किया: हालांकि मुझे यकीन है कि अगर एक निश्चित समय बाह्य को पार ट्रिगर करेगा नहीं था

start 
foo 
done 

इसके बाद फिर()।

उत्तर

3

आपको यह ध्यान रखना होगा कि कौन से कार्यों को असीमित रूप से निष्पादित किया गया है। आपके मामले में आउटपुट की पहली दो पंक्तियां तुरंत मुद्रित होती हैं जब पृष्ठ लोड किया गया था और done 60 सेकंड बाद मुद्रित किया गया था।

इन बातों को जानें:

  • सभी then* और wait* कार्यों कतार में एक कदम सम्मिलित होगा, लेकिन खुद को अतुल्यकालिक कर रहे हैं।
  • casper.emit पंजीकृत ईवेंट हैंडलर की तलाश करेगा और तुरंत इसे निष्पादित करेगा (गैर-असीमित)।
  • casper.echo तुरंत कुछ प्रिंट करेगा (गैर-असीमित)।

घटनाओं का क्रम यह है कि start कॉलबैक में, जो स्वयं एक चरण कार्य है, एक ईवेंट ट्रिगर किया जाता है और तुरंत निष्पादित किया जाता है। इस निष्पादित ईवेंट में wait कॉल है जो वर्तमान के बाद देरी चरण जोड़ता है (हम अभी भी start कॉलबैक में हैं)। फिर echo निष्पादित किया गया है और वर्तमान चरण समाप्त हो गया है। अगला कदम 60 सेकंड इंतजार कर शुरू होता है। चूंकि wait पर कोई कॉलबैक पास नहीं हुआ था, इसलिए अगला शेड्यूल चरण लागू किया गया है। यह अंतिम चरण है जिसमें echo('done') शामिल है।

तो सख्ती से बोला then पिछले चरण की घटना निष्पादन के लिए प्रतीक्षा नहीं करता है, लेकिन इस मामले में नियंत्रण प्रवाह (आमतौर पर setTimeout के माध्यम से किया) से बाहर नहीं तोड़ नहीं था और CasperJS कदम प्रोसेसर पकड़ा गया भीतरी wait कदम।

+0

बहुत अच्छी तरह से, प्रतिक्रिया के लिए धन्यवाद! अगर मैंने कुछ गैर-एसिंच तर्क के साथ प्रतीक्षा कथन को प्रतिस्थापित किया है, तो मुझे अभी भी एक ही आउटपुट की उम्मीद करनी चाहिए? मेरी समझ से स्टार्ट कॉलबैक समाप्त हो जाता है जब अंतिम गैर-एसिंच स्टेटमेंट समाप्त हो जाता है (भले ही वह कथन कुछ घटना में है), और तब() उस बिंदु से पहले निष्पादित नहीं होगा। –

+1

आपका अवलोकन सही है और आउटपुट एक जैसा होगा, लेकिन समय अलग होगा, क्योंकि अब अवरुद्ध इंतजार 'this.echo ('foo') से पहले है;' –

संबंधित मुद्दे