2013-11-06 6 views
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; 
} 

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

Ваша линия 'оповещения (флаг)' будет выполняться * перед * обратным вызовом, который вы передали '.getJSON', потому что' .getJSO N' является асинхронным. Итак, конечно, 'flag == 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 [по существу] выполнен на другом потоке. К моменту вызова callback из getJSON вы вызываете и возвращаете весь блок get_build_id. Таким образом, index никогда не будет другим значением, отличным от (ожидаемого) 0. Если вам нужно полагаться на это значение, вам необходимо выполнить код после вызова callback getJSOn. И, чтобы поддерживать подобный рабочий процесс, вы можете перенаправить вызов на этот метод, который затем вызывается в обратном вызове AJAX.

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 
}) 
Смежные вопросы