长时间工作后调用函数(回调)

时间:2011-12-12 17:38:14

标签: javascript jquery ajax

我的功能如下:

function update_List(){
            LIST=[];
            $.each(feed_urls,function(index,value){
                $.getJSON(value, function(data) {
                    $.each(data.feed.entry,function(i,val){
                           LIST.push(val.content.src);
                    });
                });
            });
          some_function();
        }

问题是some_function();LIST完全更新之前被调用。

我该如何解决这个问题?

我尝试使用自定义事件,我也在回调中查找了一些内容,但没有任何实际帮助。

编辑:我希望只有在所有some_function()个来电完成后才会调用getJSON

3 个答案:

答案 0 :(得分:6)

如果要在完成所有Ajax调用后调用该函数,则应使用deferred objects

function update_List(){
    LIST=[];
    var deferreds = [];
    $.each(feed_urls,function(index,value){
        deferreds.push($.getJSON(value, function(data) {
            $.each(data.feed.entry,function(i,val){
                LIST.push(val.content.src);
            });
        }));
    });
    $.when.apply($, deferreds).then(some_function);
 }

答案 1 :(得分:2)

你想在getJSON中调用some_function(),这样只有在异步调用完成后才能完成。

function update_List(){
            LIST=[];
            $.each(feed_urls,function(index,value){
                $.getJSON(value, function(data) {
                    $.each(data.feed.entry,function(i,val){
                           LIST.push(val.content.src);
                    });
                    some_function();
                });
            });
        }

答案 2 :(得分:1)

some_function();永远不会等待,因为$.getJSON是异步操作。

function isEveryoneDone(theList){
  var isDone = false;
  for(var jsonStatus = 0; jsonStatus< theList.length;jsonStatus++){
    if(theList[jsonStatus]){
     isDone &=theList[jsonStatus].isDone;
     if(!isDone){ break;}
    }else{
     break;
    }
  }
  return isDone;
}
function update_List(){
            LIST=new Array(feed_urls.length);
            $.each(feed_urls,function(index,value){
                $.getJSON(value, function(data) {
                    $.each(data.feed.entry,function(i,val){
                           LIST.push({"isDone":true,"src":val.content.src});
                           if(isEveryoneDone(LIST)){
                             doSomething();
                           }
                    });
                });
            });
        }