函数中的表达式在应有的情况下不会求值为true。我怎样才能解决这个问题?

时间:2019-07-03 15:58:11

标签: javascript

我正在使函数等待条件成立,然后再执行函数。输入的表达式为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并停止,但不会。

3 个答案:

答案 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)

==是一个比较运算符,其运算结果为truefalse,具体取决于操作数,您不能将其用作以后可以求值的“表达式”。您需要改用函数。

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')
);