价值没有反映出来

时间:2013-11-06 15:54:38

标签: javascript jquery

当我们打印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由另一个必须返回索引的函数调用

2 个答案:

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