Проблема с функцией автоматического вызова Javascript (Behat/Mink/Sahi)

В настоящее время я не понимаю, почему это происходит, но я не удивлюсь, если я ошибусь или пропущу одну крошечную мелочь.

Вот мой код:

(function() { 
    if (jQuery('section.news-feed ul li').text().length > 0) {
        var length1 = parseInt(jQuery('section.news-feed ul li').text().length); 
        var length2 = 0; 

        setTimeout(function() {
            length2 = parseInt(jQuery('section.news-feed ul li').text().length); 

            if (length1 !== length2) {
                return true;
            } 
            else {
                return false;
            }

        }, 3000);
    }
    else {
        return false;
    }
})()

Я ищу логический возврат, но получаю "undefined". Специальные селекторы jQuery верны, и я правильно нахожу length1 и length2.

Чтобы еще больше добавить к вопросу, если есть кто-то с опытом Behat/Mink/Sahi, вот что я хочу сделать:

Поведение:

@javascript
    Scenario: News ticker is moving
    Given I am on the homepage
    Then I should see the news ticker "section.news-feed ul li" move

Контекст:

/**
 * @Then /^I should see the news ticker "([^"]*)" move$/
 */
public function iShouldSeeTheNewsTickerMove($element) {
    $result = $this
                ->getSession()
                ->evaluateScript("
                    (function() { 
                        if (jQuery('" . $element . "').text().length > 0) {
                            var length1 = parseInt(jQuery('" . $element . "').text().length); 
                            var length2; 

                            setTimeout(function() {
                                var length2 = parseInt(jQuery('" . $element . "').text().length); 

                                if (length1 !== length2) {
                                    return true;
                                } 
                                else {
                                    return false;
                                }

                            }, 3000);
                        }
                        else {
                            return false;
                        } 
                    })()
                ");

    echo "Result: " . $result;

    if ($result === 'false') {
        throw new Exception (
            "The newws ticker doesn't seem to be ticking."
        );
    }

}

person tinyBIGideas    schedule 12.06.2013    source источник
comment
да, setTimeout() возвращает дескриптор таймера, а не возвращаемое значение какой-либо функции, которую он вызывает.   -  person Dan O    schedule 12.06.2013
comment
@roasted aahh Теперь я вижу его проблему .. Я отправил этот комментарий после просмотра кода и подумал, что он хочет, чтобы обработчик (целое число) вернулся к вызывающей стороне else false.   -  person Selvakumar Arumugam    schedule 12.06.2013


Ответы (1)


когда ваш блок if оценивается как true, ваша анонимная функция верхнего уровня не возвращает никакого значения. Вы планируете запуск функции через некоторый период времени, и все. Функция, которую вы запланировали для запуска, всегда возвращает логическое значение, но ваша анонимная функция верхнего уровня этого не делает.

Поскольку вы уже используете jQuery, я предлагаю использовать его функцию Deferred для решения твоя проблема. Вкратце, ваша функция верхнего уровня вернет вместо логического (или неопределенного! :) обещание, что она собирается выполнить какую-то работу. Когда обещание выполнено, либо сразу, либо после выполнения вызова setTimeout(), вы гарантированно получите логическое значение, ожидающее вас.

(function() {
    function foo() {
      var deferred = $.Deferred();

      if (jQuery('section.news-feed ul li').text().length > 0) {
          var length1 = parseInt(jQuery('section.news-feed ul li').text().length); 
          var length2 = 0; 

          setTimeout(function() {
              length2 = parseInt(jQuery('section.news-feed ul li').text().length); 

              if (length1 !== length2) {
                  //return true;
                  deferred.resolve(true);
              } 
              else {
                  //return false;
                  deferred.resolve(false);
              }

          }, 3000);
      }
      else {
          //return false;
          deferred.resolve(false);
      }

      return (deferred.promise());
    }

    foo().done(function(myBoolean) {
        alert(myBoolean);
    });
})()
person Dan O    schedule 12.06.2013
comment
Большое спасибо за быстрый ответ! Я действительно не думаю об этом сегодня вечером. Что бы я в идеале изменил, чтобы решить проблему? - person tinyBIGideas; 12.06.2013
comment
вы уже используете jQuery, поэтому для решения этой проблемы я бы использовал функцию jQuery Deferred. Легче объяснить с помощью кода, чем текста, поэтому позвольте мне обновить свой ответ для вас. - person Dan O; 12.06.2013
comment
о, привет. Я путаю свой JavaScript с моим Behat/Mink, но, надеюсь, вы поняли идею. - person Dan O; 12.06.2013
comment
Большое спасибо! Я дам ему водоворот и дам вам знать. Я очень ценю помощь! - person tinyBIGideas; 13.06.2013
comment
К сожалению, я все еще получаю «undefined» в качестве начального вывода, а затем «true» через 3 секунды. Проблема, скорее всего, связана с обработкой минка, где он независимо принимает первый ответ с помощью метода AssessmentScript(). Очень неудобная проблема, которую я действительно не знаю, как обойти. - person tinyBIGideas; 13.06.2013