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

ブロックがiftrue と評価されると、最上位の無名関数は値を返しません。一定期間後に関数を実行するようにスケジュールし、それで終わりです。実行をスケジュールする関数は常にブール値を返しますが、最上位の無名関数はそうではありません。

あなたはすでに 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 に答える