2015-09-11 3 views
-1

У меня есть цикл для получения данных через $ post. И после того, как все данные будут получены, мне нужно иметь функцию обратного вызова. Мой текущий код только обратный вызов сначала и пост. Как я могу сделать это наоборот?callback после каждого сообщения выполняется в jQuery

function addMegaMenu(callback){ 
    $('#megamenu > ul > li').each(function(){ 
     $.post('/_menu.cfm', function(data){ 
      console.log("post exec"); 
     }) 
    }); 
    callback.apply(); 
} 
function addMobileIcon(){ 
    console.log("callback exec"); 
} 
$(function(){ 
    addMegaMenu(function(){ 
     addMobileIcon(); 
    }); 
}) 

Он печатает:

callback exec 
post exec 

мне нужно сделать это:

post exec 
callback exec 

ответ

1

Сначала создайте список deferreds, каждый $.post возвратит отложила ...

$.post('/_menu.cfm', ... in a loop 

Когда вы есть этот список обещания:

$.when.apply($, promises).then(function(d) { 
     console.log("done", this, d); 
    }, function(e) { 
     console.log("failed"); 
    }); 
0

Так как вам нужно ждать, пока все элементы не выполнили свою функцию обратного вызова, вы должны отслеживать, как много невыполненных запросов POST есть:

var counter = 0; 
function addMegaMenu(callback){ 
    $('#megamenu > ul > li').each(function(){ 
     counter++; 
     $.post('/_menu.cfm', function(data){ 
      counter--;   
      console.log("post exec"); 
      if (counter==0) { 
       callback.apply(); 
      } 
     }) 
    }); 
} 
function addMobileIcon(){ 
    console.log("callback exec"); 
} 
$(function(){ 
    addMegaMenu(function(){ 
     addMobileIcon(); 
    }); 
})