我正在使函数等待条件成立,然后再执行函数。输入的表达式为a ==5。a开头等于0,并且每次执行该函数时,它都会增加1.。当它等于5时,该函数的结果仍为false。
我的.js文件:
var _ = {
waitUntil: function(duringExecution, expression, onCompletion) {
test();
function test(){
console.log(a + ' ' + expression);
if((expression) == true) {
onCompletion();
} else {
duringExecution();
setTimeout(test, 200);
}
}
}
}
a = 0;
_.waitUntil(function() {
a++;
}, a == 5, function() {
console.log('yay');
});
我的HTML文件中没有任何内容,除了脚本标签。
<!DOCTYPE html>
<html>
<head>
<title>example lul</title>
</head>
<body>
<script src='under.js'></script>
</body>
</html>
每次运行该函数时,它都会打印a的值和表达式的结果。控制台仅打印:
1 false
2 false
3 false
4 false
5 false
6 false
7 false
...
它永远存在。当a == 5时,它应打印a true
并停止,但不会。
答案 0 :(得分:2)
每当您编写一个表达式时,它总是被求值为其值。例如,当您将contentDocument
传递给函数时,它将返回<script>
document.getElementById("some_frame").onload = function() { // or you could use `addEventListener("load", function(){...})`
this.contentDocument.getElementById("some_element_in_frame").doThing(...)
}
</script>
并将a == 5
传递给该函数。
您需要将false
包装在一个函数中。并在需要检查条件时调用它。
false
答案 1 :(得分:2)
==
是一个比较运算符,其运算结果为true
或false
,具体取决于操作数,您不能将其用作以后可以求值的“表达式”。您需要改用函数。
var _ = {
waitUntil: function(duringExecution, expression, onCompletion) {
test();
function test(){
console.log(a + ' ' + expression());
if(expression() == true) {
onCompletion();
} else {
duringExecution();
setTimeout(test, 200);
}
}
}
}
function compareA() {
return a == 5;
}
a = 0;
_.waitUntil(function() {
a++;
}, compareA, function() {
console.log('yay');
});
答案 2 :(得分:2)
执行此操作时:
_.waitUntil(function() {
a++;
}, a == 5, function() {
console.log('yay');
});
a == 5
立即被评估为false
,因此您的waitUntil
函数正在接收以下输入:
duringExecution
= function () { a++ }
expression
= false
onCompletion
= function () { console.log('yay') }
您需要做的是使第二个参数成为一个返回a
是否为5
的函数,并更改您的waitUntil
函数以在每次迭代时都调用它。因此,您的函数定义为:
var _ = {
waitUntil: function(duringExecution, expression, onCompletion) {
test();
function test(){
console.log(a + ' ' + expression);
if (expression()) { // <-- changed this line to call `expression`, removed `== true` as it's not necessary, "if" is already checking for a truthy value
onCompletion();
} else {
duringExecution();
setTimeout(test, 200);
}
}
}
}
您的呼叫将是:
_.waitUntil(function() {
a++;
}, function () {
return a == 5;
}, function() {
console.log('yay');
});
或者,使用arrow functions的较短版本:
_.waitUntil(
() => { a++ },
() => a == 5,
() => console.log('yay')
);