0

当我们在内部打印 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;
}

@布拉德克里斯蒂

再次面临同样的问题。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 被另一个必须返回索引的函数调用

4

2 回答 2

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 回调中调用该方法。

于 2013-11-06T15:58:14.460 回答
0

你肯定有异步代码的问题。由于getJSON是异步的,设置标志的代码将在父函数返回后设置,因此它将始终返回 -1

您可以确保内置的 jQuery deferred/promise 架构有助于缓解问题,但您可能需要重构代码才能在这种情况下工作

can 可以只返回getJSON调用的结果,这是一个 jquery承诺并管道返回值

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
})
于 2013-11-06T16:09:25.807 回答