对于内部ajax的Cyclo,回调返回错误的结果

时间:2013-01-14 17:47:28

标签: javascript ajax jquery

我尝试创建一个加载多个RSS的jquery插件(它们是灵活的可以是1或2或3等...),用于创建显示加载的新闻源的html。我的目标是可以加载多个rss feed(xml)并通过html显示它们。当我尝试似乎回调被覆盖时,我收到2个结果但是相等。

示例:

(function($){
    $.fn.getFeed = function(Obj){
        var
            arrOpt = Obj.arrayOptions,
            arrOptLng = arrOpt.length;

        for(var i = 0; i < arrOptLng; i++){
            var 
                index = i,
                Opt = arrOpt[i],
                feedUrl = Opt.feed,
                sucFnc = Opt.callback,
                $cnt = this;

            console.log(index);
            // here:
            // 0
            // 1

            $.ajax({
                url:feedUrl,
                dataType: "jsonp",
                success:function(data){
                    sucFnc(data,$cnt,Opt,index);
                },
                error:function(){
                    $cnt.html('error');
                }
            });
        }
    }
})(jQuery);

function feedManipulation(){
    console.log(index)
    // here:
    // 1
    // 1
}

/* DOM LOADED */
$(function(){
    $('.news').getFeed({ // Activation getFeed
        arrayOptions:[{
            feed:'http://feed', 
            callback:feedManipulation,
            imgDefault:'http://img',
            nArtc:1
        },{
            feed:'http://feed', 
            callback:feedManipulation,
            imgDefault:'http://img',
            nArtc:1
        }]
    });
});

1 个答案:

答案 0 :(得分:0)

Ciao,我写了这个问题并且我创建了解决方案,所以我会解释。 在这段代码中,我删除了循环for,并创建了一个包含ajax调用的函数。 我第一次触发ajax函数时,我将一个参数传递给ajax函数,并在我用来设置plugIn(底部锁定)的对象内部,而我的ajax函数本身就是调用,然后将相同的对象发送到ajax函数我改变了一些像“Opt.index”这样的信息,用这种方式创建了一个ajax循环。这真的很有用;)使用它。

(function($){
        $.fn.getFeed = function(Obj){

            // Options object
            Opt = new Object();
            Opt.index = 0;
            Opt.$cnt = this;
            Opt.arrOpts = Obj.arrayOptions;
            Opt.arrOptLng = Opt.arrOpts.length;
            Opt.arrOpt = Opt.arrOpts[Opt.index];
            Opt.feedUrl = Opt.arrOpts[Opt.index].feedUrl;

            // ajax call
            cycloAjax(Opt);
        }

        /* ajax cyclo */
        function cycloAjax(Obj){
            $.ajax({
                url: Obj.feedUrl,
                dataType: "jsonp",
                success:function(data){
                    feedManipulation(data,Obj.$cnt,Obj);

                    if(Obj.index < Obj.arrOptLng - 1){
                        Obj.index++;
                        Obj.arrOpt = Obj.arrOpts[Obj.index];
                        Obj.feedUrl = Obj.arrOpts[Obj.index].feedUrl;
                        cycloAjax(Obj);
                    }
                    else{
                        completeLoadFeeds(Obj.$cnt,Obj);
                    }
                },
                error:function(){
                    Obj.$cnt.html('<p>error</p>');
                }
            });
        }

        .
        .
        .

    })(jQuery);

    /* DOM LOADED */
    $(function(){
        $('.news').getFeed({ // Activation getFeed
            arrayOptions:[{
                feed:'http://feed', 
                callback:feedManipulation,
                imgDefault:'http://img',
                nArtc:1
            },{
                feed:'http://feed', 
                callback:feedManipulation,
                imgDefault:'http://img',
                nArtc:1
            }]
        });
    });