2015-01-04 11 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 

Хотя я не был уверен, что при превышении определенного времени будет приводить в затем then().

ответ

3

Вы должны иметь в виду, какие функции выполняются асинхронно. В вашем случае первые две строки вывода печатаются сразу же после загрузки страницы и done были напечатаны через 60 секунд.

Что нужно знать:

  • Все then* и wait* функции вставит шаг в очереди, но сами по себе являются асинхронными.
  • casper.emit будет искать зарегистрированный обработчик событий и выполнить его немедленно (неасинхронно).
  • casper.echo распечатает что-нибудь сразу (неасинхронно).

Порядок событий в том, что в обратном вызове start, который сам является функцией шага, событие запускается и сразу же выполняется. Это выполненное событие содержит вызов wait, который добавляет отложенный шаг после текущего (мы все еще находимся в обратном вызове start). Затем выполняется echo, и текущий шаг завершен. Следующий шаг начинается с ожидания 60 секунд. Поскольку обратный вызов не был отправлен на wait, выполняется следующий шаг. Это последний шаг, который содержит echo('done').

Так строго говоря then не ждет выполнения события предыдущего шага, но в этом случае не было никакого перерыва из потока управления (обычно делается через setTimeout) и шаг процессор CasperJS поймал внутренний wait шаг.

+0

Очень тщательный, спасибо за ответ! Если я заменил оператор wait какой-то неасинхронной логикой, которая заняла некоторое время, должен ли я ожидать такой же вывод? По моему мнению, начальный обратный вызов заканчивается после завершения последнего неасинхронного состояния (даже если этот оператор находится в некотором случае), а затем() не будет выполняться до этой точки. –

+1

Ваше наблюдение верное, и вывод будет одинаков, но тайминги будут разными, так как теперь блокируемое ожидание до 'this.echo ('foo');' –