Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jQuery中执行每个post后回调_Javascript_Jquery - Fatal编程技术网

Javascript 在jQuery中执行每个post后回调

Javascript 在jQuery中执行每个post后回调,javascript,jquery,Javascript,Jquery,我有一个通过$post获取数据的循环。在获取所有数据之后,我需要一个回调函数。我当前的代码只会先回调然后再发布。我怎么能反过来做呢 function addMegaMenu(callback){ $('#megamenu > ul > li').each(function(){ $.post('/_menu.cfm', function(data){ console.log("post exec"); }) })

我有一个通过$post获取数据的循环。在获取所有数据之后,我需要一个回调函数。我当前的代码只会先回调然后再发布。我怎么能反过来做呢

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

首先创建一个延迟列表,每个
$。post
将返回一个延迟

$.post('/_menu.cfm',  ... in a loop
当您拥有承诺列表时:

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

由于您需要等待所有元素完成回调,因此必须跟踪有多少未完成的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();
    });
})