Javascript:检查函数是否为TRUE

时间:2014-03-10 12:27:26

标签: javascript titanium

我有一个函数,当满足FOR cyklus中的IF条件时,该函数应该返回TRUE。 (我测试了那个条件,它有效)

createBtn.addEventListener('click',function (e){

var ch = function check(){
var url = "http://hotel.010.sk/skyfit/read.php";
var json, poc, vypis;
var i=0;

var xhr = Ti.Network.createHTTPClient({
    onload: function() {
    json = JSON.parse(this.responseText);


        for (i = 0; i < json.poc.length; i++) {

            prnt = json.poc[i];  

            if(win.xtra_id == prnt.id_cv && picker.getSelectedRow(0).title == prnt.datum && prnt.capacity <= prnt.cnt ){

                return true;
            }

        };

    }

});


xhr.open("GET", url);
xhr.send();             

};

...

但是当我在这里调用函数进行检查时,它总是 true ,除非check()中的IF条件不满足!

if(ch){

alert('Something');       
}

如何修复我的功能,只有在满足条件时才能获得TRUE?

感谢。

3 个答案:

答案 0 :(得分:2)

此表达式

if (ch) {

始终为true,因为ch是一个函数,ToBoolean(function) === true

但是,即使您将其更改为if (ch()) {..},它也无法正常工作,因为在函数内部执行异步操作。函数只返回而不等待它完成。在这种情况下,您应该使用回调或承诺模式。最简单的就是回调。

var ch = function check(callback) {

    // ...

    var xhr = Ti.Network.createHTTPClient({
        onload: function () {
            json = JSON.parse(this.responseText);
            var status = false;
            for (i = 0; i < json.poc.length; i++) {
                prnt = json.poc[i];
                if (win.xtra_id == prnt.id_cv && picker.getSelectedRow(0).title == prnt.datum && prnt.capacity <= prnt.cnt) {
                    status = true;
                }
            };
            callback(status);
        }
    });

    // ...
};

ch(function(status) {
    if (status) {
        alert('Something')
    }
});

答案 1 :(得分:1)

请尝试以下事项检查条件应始终 true

while(true){
    alert('something');
}

答案 2 :(得分:0)

您的函数ch没有返回值!它启动Ti.Network.createHTTPClient函数,您可以在其中定义匿名回调函数(onload: function(){...)。在 ch已经返回之后,执行该匿名函数。您需要在回调后检查条件:

...
                         if (win.xtra_id == prnt.id_cv && picker.getSelectedRow(0).title == prnt.datum && prnt.capacity <= prnt.cnt) {
                             alert('something') //DO YOUR STUFF HERE!
                             return true;
                         }
...

在使用某些全局标志检查条件之前等待回调发生:

var MYFLAG=-1

...
                         if (win.xtra_id == prnt.id_cv && picker.getSelectedRow(0).title == prnt.datum && prnt.capacity <= prnt.cnt) {
                             MYFLAG=1
                             return true;
                         }
                         else
                         {
                             MYFLAG=0
                         }
...

//use a timer to check the flag every 500ms
var myInterval = setInterval(function()
    {     
    if (MYFLAG != -1) {
        if (MYFLAG==1) {
            alert('returned true :)');
        }
        else {
            alert('did not return true :(');
        }

        clearInterval(myInterval);
    }
}, 500);