0

我正在尝试在 Javascript 中创建一个递归函数。但是为了正确循环我的 XML 文件,我试图传递从 XML 中获取的正确值length并将其传递给setTimeout函数。问题是setTimeout( setTimeout('cvdXmlBubbleStart(nextIndex)', 3000); ) 函数没有得到 的值nextIndex并且认为它是undefined。我确定我做错了什么。

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); 
}
4

2 回答 2

2

Checkout如何将参数传递给 setTimeout() 回调?- 基本上你需要将一个匿名函数传递给设置超时调用

setTimeout(function(){
    cvdXmlBubbleStart(nextIndex)
}, 3000); 
于 2013-06-17T22:30:55.183 回答
2

使用匿名函数会起作用,因为它与nextIndex.

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

您当前的代码对您不起作用的原因是,当您在setTimeout函数内部使用字符串时,它会使用构造函数根据传递的字符串Function创建一个(这与 using 类似,但不是最佳实践)。这里更糟糕的是,创建的函数不会与创建它的地方共享相同的范围,因此无法访问.functionevalFunctionnextIndex

于 2013-06-17T22:35:03.883 回答