2013-03-25 9 views
0

Я пытаюсь получить переменную (lib) из нескольких вложенных функций.Получить переменную из нескольких вложенных функций

var nme='name',lib; 

$('script').each(function(){ 

    var src=$(this).attr('src'); 

    if(typeof(src)==='undefined'){src='';} 

if(src.indexOf(nme)!==-1){ 

    $.get($(this).attr('src').match(/\w([^ ]+)spbin/)[0]+'/conf/ptmedia.plist', 
     function(c){ 
      $(c).find('key').each(function(){ 
       if($(this).html()==='MediaLib'){lib=$(this).next().html();} 
      }); 
     } 
    ); 

} 
}); 

if(lib==='some lib'){DO STUFF} 
+4

Ajax - ** асинхронный **! Переместите '$ ('. Null'). Html (lib);' в обратный вызов успеха. Дополнительная информация здесь: http://stackoverflow.com/q/14220321/218196. –

+0

Почему ты не можешь просто ... Подождите, что случилось: это должно работать нормально. –

+1

Вы действительно пытаетесь загрузить скрипты через ajax, чтобы что-то найти в своем исходном коде? Тогда вы делаете что-то не так. – Bergi

ответ

0

Я решил эту проблему следующим образом:

var nme='name'; 

    $('script').each(function(){ 

    var src=$(this).attr('src'); 

     if(typeof(src)==='undefined'){src='';} 

     if(src.indexOf(nme)!==-1){media=$(this).attr('src').match(/\w([^ ]+)spbin/)[0];} 

    }); 


    function ffn(){ 
    $($.ajax({url:media+'/conf/ptmedia.plist',async:false}).responseText).find('key').each(function(){ 
     if($(this).html()==='string'){value=$(this).next().html();} 
    }); 

    return value; 
    } 

    if(ffn()==='some lib'){DO STUFF} 

Спасибо всем за участие и хорошие идеи!

+0

Привет, используя синхронный AJAX, как правило, является плохим решением. Он блокирует браузер до тех пор, пока он не достигнет (например, окно может не отвечать (застрять) на 10 секунд), и это, как правило, нецелесообразно. Я бы передумал. –

+0

@BenjaminGruenbaum Привет! Спасибо за ваш комментарий! Возможно, вы могли бы предложить другое решение? – Aleksov

+0

Я тоже :) В моем ответе также выясняется, что этот вопрос является дубликатом другого, вы можете также проверить ответы там –

4

Ваша проблема не с обзорного, проблема заключается в том, что у вас есть вызов AJAX, который является асинхронным. Вы должны поставить изменения HTML в .null внутри функции обратного вызова вместо:

$.get($(this).attr('src').match(/\w([^ ]+)spbin/)[0]+'/conf/ptmedia.plist', 
     function(c){ 
      $(c).find('key').each(function(){ 
       if($(this).html()==='MediaLib'){lib=$(this).next().html();} 

       $('.null').html(lib); 
      }); 
     } 
}); 

В JavaScript часто IO является асинхронный. Это означает, что при вызове AJAX это происходит не сразу, а скорее ожидает возврата значения из HTTP-запроса, а затем вызывает обратный вызов . В вашем случае, что function(c) является обратным вызовом, он запускается, когда получена стоимость звонка AJAX.

Таким образом, вы обновили содержимое HTML от .null до неопределенного, так как оно получило значение lib, прежде чем оно было обновлено.

+0

+1, но вы должны объяснить, что это значит –

+0

Это работает, но мне нужно получить эту переменную в другом месте – Aleksov

+0

@Aleksov в этом случае вам нужно убедиться, что к этому времени произошел обратный вызов. JavaScript работает (как правило, есть способы обойти это) в _single thread_, на каждой итерации он проверяет все события, которые происходят (например, возвращаемое значение AJAX) и запускает на их основе код. Если вам нужна ваша переменная lib, она должна _MUST_ быть в этом обратном вызове. Если вы чувствуете, что получаете грязный код, вы можете переместить его в метод. –

Смежные вопросы