0

我目前不知道为什么会发生这种情况,但如果我偏离了方向,或者错过了一件小事,我不会感到惊讶。

这是我的代码:

(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 特定的选择器是正确的,我正确地找到了 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."
        );
    }

}
4

1 回答 1

2

当您的if块评估为真时,您的顶级匿名函数不会返回任何值。您正在安排一个函数在一段时间后运行,然后就是这样。您计划运行的函数总是返回一个布尔值,但您的顶级匿名函数不会。

由于您已经在使用 jQuery,我建议您使用其Deferred功能来解决您的问题。简而言之,您的顶级函数将返回,而不是一个布尔值(或未定义的!:),它会做一些工作的承诺。当 promise 被履行时,无论是立即还是在调用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);
    });
})()
于 2013-06-12T18:41:42.310 回答