我目前不知道为什么会发生这种情况,但如果我要么离开,要么错过一个小小的东西,我也不会感到惊讶。
这是我的代码:
(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."
);
}
}
答案 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);
});
})()