2013-06-17 4 views
0

Я пытаюсь создать рекурсивную функцию в Javascript. Но чтобы правильно заколить свой XML-файл, я пытаюсь передать правильное значение, взятое из XML length, и передать его функции setTimeout. Проблема в том, что функция setTimeout (setTimeout('cvdXmlBubbleStart(nextIndex)', 3000); ) не получает значение nextIndex и считает это undefined. Я уверен, что делаю что-то неправильно.Javascript pass variable через рекурсивную функцию

jQuery(document).ready(function($) { 
cvdXmlBubbleStart('0'); 
}); 

function cvdXmlBubbleStart(nextIndex) { 
    $.ajax({ 
     url: "cross_video_day/xml/broadcasted.xml", 
     dataType: "xml", 
     cache: false, 
     success: function(d) { 
      broadcastedXML = d; 
      cvdBubbleXmlProcess(nextIndex); 
     } 
    }); 
} 

function cvdBubbleXmlProcess(nextIndex) { 
    var d = broadcastedXML; 
//console.log(nextIndex); 
    var length = $(d).find('tweet').length; 
    if((nextIndex + 1) < length) { 


    nextIndex = length - 1; 


    $(d).find('tweet').eq(nextIndex).each(function(idx) { 
     var cvdIndexId = $(this).find("index"); 
     var cvdTweetAuthor = $(this).find("author").text(); 
     var cvdTweetDescription = $(this).find("description").text(); 
     if (cvdTweetAuthor === "Animator") { 
      $('#cvd_bubble_left').html(''); 
      obj = $('#cvd_bubble_left').append(makeCvdBubbleAnimator(cvdIndexId, cvdTweetAuthor, cvdTweetDescription)); 
      obj.fitText(7.4); 
      $('#cvd_bubble_right').html(''); 
      setTimeout('$(\'#cvd_bubble_left\').html(\'\')', 3000); 
     } else { 
      $('#cvd_bubble_right').html(''); 
      obj = $('#cvd_bubble_right').append(makeCvdBubble(cvdIndexId, cvdTweetAuthor, cvdTweetDescription)); 
      obj.fitText(7.4); 
      $('#cvd_bubble_left').html(''); 
      setTimeout('$(\'#cvd_bubble_right\').html(\'\')', 3000); 
     } 

    }); 

     }else{ 
     $('#cvd_bubble_left').html(''); 
      $('#cvd_bubble_right').html(''); 
     }  
     //broadcastedXMLIndex++; 
     setTimeout('cvdXmlBubbleStart(nextIndex)', 3000); 
} 
+0

Попробуйте передать функцию 'setTimeout' вместо строки:' setTimeout (function() {cvdXmlBubbleStart (nextIndex);}, 3000) ' – basilikum

+0

Удалена ли поддержка строки? Не сказать, что это хорошая идея, но [в последний раз, когда я проверял, что все еще работает] (https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout). –

+0

OP: Вы должны использовать функцию, как показано в ответе streetlogics. Как написано, вам нужно * построить * строку, например, '' cvdXmlbubbleStart ('"+ nextIndex"') ". Хотя это меня озадачивает, почему вы используете строку, если это индекс. –

ответ

2

Использование анонимной функции будет работать, потому что он разделяет ту же сферу, как nextIndex.

setTimeout(function(){cvdXmlBubbleStart(nextIndex);}, 3000); 

Причина, по которой ваш текущий код не работает для вас, потому что, когда вы используете строку внутри функции setTimeout он использует Function конструктор для создания function на основе переданной строки (которая похожа на использование eval и не является лучшей практикой). Хуже здесь то, что функция, созданная с помощью Function, не будет обладать той же областью, где она была создана, и, следовательно, не имеет доступа к nextIndex.

2

заказ How can I pass a parameter to a setTimeout() callback? - в основном вам нужно передать анонимную функцию к заданному времени ожидания вызова

setTimeout(function(){ 
    cvdXmlBubbleStart(nextIndex) 
}, 3000); 
+0

Строки больше не поддерживаются? [Это показывается как выполнимое на MDN] (https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout). –

+0

@DaveNewton - строки поддерживаются, они входят в конструктор 'Function' –

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