当我们打印index里面的值时,如果它显示正确的结果,但是当打印在外面时相同的变量索引显示值0(最初指定的值)。 我认为getJSON的异步行为存在一些问题(不太确定)。 谁能告诉我可能的解决方案是什么?
function get_build_id(query,node_file_name)
{
//alert(query);
flag = 0;
index = 0;
$.getJSON(node_file_name,function(data)
{
$.each(data,function(i,x)
{
index=index+1;
if (x.name.toLowerCase()==query.toLowerCase() )
{
flag=1;
//alert("index2 "+index);
return false;
}
});
});
//alert("index is "+ index);
alert(flag);
if(flag==1)
return index;
else
return -1;
}
@Brad Christie
再次面临同样的问题。 ind值给出正确的结果,但索引值始终为0.
function get_build_id(query, node_fil_name, callback)
{
var ind = 0;
$.getJSON(node_fil_name, function(data)
{
$.each(data, function(i,x)
{
ind = ind + 1;
if (x.name.toLowerCase() == query.toLowerCase()){
callback(ind); // found match
return false;
}
});
callback(0); // no match found
});
}
function get_hash_val(roomno,room_file_name,node_file)
{
var flag=0,ind;
get_build_id(roomno,node_file, function(ind)
{
alert(ind);
index=ind;
});
alert(index);
if(index!=0)
return index;
else
return -1;
}
// get_hash_value由另一个必须返回索引的函数调用
答案 0 :(得分:1)
你钉了它;一旦你点击getJSON,你就不在工作流程中了。你不能在函数中使用AJAX调用返回一个值,你需要传递一个回调方法(然后在成功的AJAX查询中调用它)。
想象一下以下内容:
function get_build_id(query, node_fil_name, callback){
flag = 0;
index = 0;
$.getJSON(node_fil_name, function(data){
$.each(data, function(i,x){
index++; // index = index + 1;
if (x.name.toLowerCase() == query.toLowerCase()){
callback(index); // found match
return false;
}
});
callback(/* or return 0 */); // no match found
});
}
然后实施:
get_build_id('/some/file', 'foo', function(index){
if (index !== undefined){ // or index != 0
// match was found
}
});
但为什么?
AJAX [基本上]在另一个线程上执行。当调用getJSON的回调时,您已经调用并返回了整个get_build_id
块。因此,index
永远不会是(预期的)0以外的其他值。如果需要依赖此值,则必须在调用getJSOn回调后执行代码。并且,为了保持工作流程类似,您可以将回调转发给该方法,然后在AJAX回调中调用该方法。
答案 1 :(得分:0)
您确实遇到异步代码问题。由于getJSON
是异步的,因此设置该标志的代码将在父函数返回后设置,因此它将始终返回-1
您可以确保内置的jQuery延迟/保证体系结构以帮助缓解此问题,但您可能需要重构代码以便在这种情况下工作
可以只返回getJSON
调用的结果,这是一个jquery promise并管道返回值
function get_build_id(query,node_file_name)
{
var flag, index,
promise = $.getJSON(node_file_name);
return promise.then(function(data){
&.each(data,function(i,x){
index=index+1;
if (x.name.toLowerCase()==query.toLowerCase() )
{
flag=1;
return false;
}
});
if(flag==1)
return index;
else
return -1;
})
}
get_build_id("foo", "bar").done(function(index){
//do stuff here with the value
})