Jquery 等待.each()完成,前提是.each()有AJAX调用

Jquery 等待.each()完成,前提是.each()有AJAX调用,jquery,asynchronous,Jquery,Asynchronous,可能重复: 这个问题实际上是一个延续。如果在它的回调函数中有$.get(),我们如何等待each()完成它的执行 可以找到工作示例 /* JavaScript / jQuery. */ <script> function prepareLayer($n) { $.get('./a.html', function(data) { /* a.html contains: <a href="javascript:void(0);">Cl

可能重复:

这个问题实际上是一个延续。如果在它的回调函数中有
$.get()
,我们如何等待
each()
完成它的执行

可以找到工作示例

/* JavaScript / jQuery. */
<script>        
function prepareLayer($n) {
    $.get('./a.html', function(data) {
        /* a.html contains: <a href="javascript:void(0);">Click me!</a> */
        $n.html(data);
    });
}

function postPreparation() {
    $('.element a').click(function() {
        alert('Ouch... you just clicked me!');
    });
}

$(function() {
    $('.element').each(function() {
        prepareLayer($(this));
    });

    postPreparation();
});
</script>

<!-- HTML -->
<div class="element"></div>
<div class="element"></div>
/*JavaScript/jQuery*/
函数prepareLayer($n){
$.get('./a.html',函数(数据){
/*a.html包含:*/
$n.html(数据);
});
}
函数后处理(){
$('.element a')。单击(function(){
警惕(“哎哟……你刚才点击了我!”);
});
}
$(函数(){
$('.element')。每个(函数(){
准备层($(本));
});
后处理();
});

@Alnitak为您提供了这个问题的大部分解决方案:

丢失的那块看起来像

function prepareLayer($n) {
    var dfd=$.Deferred();
    $.get('./a.html', function(data) {
        /* a.html contains: <a href="javascript:void(0);">Click me!</a> */
        $n.html(data);
        dfd.resolve();
    });
    return dfd.promise();
}

请更新您的上一个问题,而不是仅用小更新重新发布。此外,Alnitaks的答案已准备就绪,包括异步请求的解决方案。Wait@Yoshi,该问题中公认的答案并没有提供如何解决此问题的解决方案。它只确认了这里描述的事实/问题。当然,如果你看一下文档,很高兴这还没有结束,它肯定会确认的@尼可什提供了有效的答案。上面提到的“可能重复”问题提供了一个良好的背景和讨论。现在,这是真正的解决方案!非常感谢(+1),@nikoshr.
$。当(def).done(postpraining)
(即不带apply())时,将立即执行
postpraining
。你知道为什么会这样吗?我的意思是,为什么在apply()中传递
$
作为上下文使得()何时等待?@Siku-Siku.Com上下文是无关的,方法签名是。$。当接受一个或多个延迟对象或普通JavaScript对象作为其参数并对其调用apply时,会将def数组转换为其参数<代码>$。当(def)陷入参数不是延迟参数的情况,因此会立即解决。看啊。。。现在清楚了;感谢(+1)的解释。一个非常常见的问题的绝妙答案,在jQuery文档中记录得非常糟糕。谢谢你的解释(+1010101,如果可以的话)。
function prepareLayer($n) {
    var dfd=$.Deferred();
    $.get('./a.html', function(data) {
        /* a.html contains: <a href="javascript:void(0);">Click me!</a> */
        $n.html(data);
        dfd.resolve();
    });
    return dfd.promise();
}
function prepareLayer($n) {
    return $.get('./a.html').then(function(data) {
        $n.html(data);
    });
}