0

正しい結果が表示される場合は内側のインデックスの値を出力しますが、外側に出力すると同じ変数インデックスは値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 value は正しい結果を返しますが、index 値は常に 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 アーキテクチャが問題の軽減に役立つことを確認できますが、この場合、コードをリファクタリングして動作させる必要がある場合があります。

getJSONjquery 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
})
于 2013-11-06T16:09:25.807 に答える