我有一个函数,当满足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?
感谢。
答案 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);