Casperjs, как действовать только после получения ответа на вызов ajax

Я хочу, чтобы casperjs выполнял вызов ajax, но ждал результата с моего сервера. Это может занять до 3 минут, но, глядя на результаты выполнения моего скрипта, я могу сказать, что время ожидания функции casper.then истекает и продолжается ровно через 30 секунд. Я пробовал поставить casper.options.waitTimeout = 180000 /* 3 минуты */; в моем коде, который действительно работает, и я пытался использовать этот блок кода, который, кажется, ждет 3 минуты каждый раз, независимо от результата моего вызова API.

Я также знаю, что функция оценки возвращает только логическое значение каждый раз, несмотря ни на что, и это не сработает, поскольку мне нужны данные вызова API, которые возвращаются в остальной части моего скрипта. Как я могу заставить эту функцию ждать 3 минуты? И многое происходит за кулисами, так что да, мне нужно ждать так долго.

var casper = require('casper').create();

casper.start('mysite.html', function() {
});

casper.then(function() {
  result = getSomethingFromMyServerViaAjax( theId );
});

Это альтернативный метод, который я пробовал, который, кажется, всегда ждет 3 минуты независимо от скорости возврата вызова ajax.

casper.waitFor(function check() {
    return this.evaluate(function() {
        return result = getSomethingFromMyServerViaAjax( theId ) /* this takes up to 3 minutes */;
    });
}, function then() {
   casper.log("Doing something after the ajax call...", "info");
   this.die("Stopping here for now", "error");
}, 180000 );

Я проверил свой вызов ajax в другом месте, и он работает, если ответ возвращается менее чем за 30 секунд, но если он не работает, casper просто пропускает этот блок и продолжает работать каждый раз.


person Jeremy Gehrs    schedule 04.11.2013    source источник


Ответы (1)


Вы были почти там. Вам нужно инициировать ваш длительный вызов. Кажется, что он синхронный, поэтому я поместил его внутрь setTimeout. Результат через некоторое время записывается в window.resultFromMyServerViaAjax.

this.evaluate также является синхронным, но после его выполнения запланирован шаг wait, который периодически проверяет, установлено ли свойство окна.

var casper = require('casper').create(),
    theId = "#whatever";

casper.start('mysite.html');

casper.then(function() {
    // trigger 
    this.evaluate(function(theId){
        window.resultFromMyServerViaAjax = null;
        setTimeout(function(){
            window.resultFromMyServerViaAjax = getSomethingFromMyServerViaAjax(theId);
        }, 0);
    }, theId);
    this.waitFor(function check() {
        return this.evaluate(function() {
            return !!window.resultFromMyServerViaAjax;
        });
    }, function then() {
       casper.log("Doing something after the ajax call...", "info");
    }, function onTimeout() {
       this.die("Stopping here for now", "error");
    }, 180000 );
});
casper.run();
person Artjom B.    schedule 28.06.2014