2013-06-12 4 views
0

Я в настоящее время не понимаю, почему это происходит, но я не удивлюсь, если бы я был в любом случае, или пропустил одну крошечную мелочь.Проблема с функцией самозапуска 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; 
    } 
})() 

Я ищу булевое возвращение, хотя, я получаю 'не определена'. Правильные селектора jQuery верны, и я правильно определяю длину 1 и длину 2.

Для дальнейшего добавить к EnCase вопрос есть кто-то с опытом Behat/норка/Sahi, это то, что я ищу, чтобы сделать:

Behat:

@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." 
     ); 
    } 

} 
+0

Да, 'setTimeout()' возвращает дескриптор таймера, а не возвращаемое значение любой функции, которую он вызывает. –

+0

@roasted aahh Теперь я вижу его проблему. Я опубликовал этот комментарий после проскальзывания кода и подумал, что он хочет, чтобы обработчик (целое число) вернулся к вызывающей стороне else 'false'. –

ответ

2

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

Поскольку вы уже используете 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); 
    }); 
})() 
+0

Большое спасибо за быстрый ответ! Мой разум действительно не в этом сегодня. Что бы я идеально изменил, чтобы исправить проблему? – tinyBIGideas

+0

вы уже используете jQuery, поэтому я бы использовал функцию отсрочки jQuery для решения этой проблемы. Это проще объяснить с помощью кода, чем текста, поэтому позвольте мне обновить свой ответ для вас. –

+0

о, эй. Я испортил свой JavaScript с моей Behat/Mink, но, надеюсь, вы получите эту идею. –