Javascript自调用函数问题(Behat / Mink / Sahi)

时间:2013-06-12 18:38:08

标签: javascript jquery 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."
        );
    }

}

1 个答案:

答案 0 :(得分:2)

当您的if块的计算结果为true时,您的顶级匿名函数不会返回任何值。你计划在一段时间后运行一个函数,然后就是这样。您计划运行的函数DOES始终返回一个布尔值,但您的顶级匿名函数不会。

由于您已经在使用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);
    });
})()