jquery延迟了map / each

时间:2012-08-08 20:43:17

标签: jquery jquery-deferred

我之前没有使用延迟,但我已经在这里和那里阅读了一些内容,根据我的理解,听起来它们是我现有问题的解决方案。我有一个页面,必须在其上加载4个广告。之前由于服务器为每个广告查询数据库所花费的时间,页面速度变慢。所以我将横幅广告调用移动到了网络服务。这工作正常但是如果我没有广告我需要隐藏容器div,这意味着我需要知道所有ajax调用何时完成,然后检查是否有任何广告被加载。

我有以下代码成功调用Web服务并加载广告,但似乎then()函数没有正常工作。它似乎是在ajax调用完成之前执行的。我从这个页面JQuery deferred with .each()获得了我的代码,我唯一能看到的是,在他们的示例中,它显示了在延迟中返回函数调用。但我尝试用return {}包围我的函数内部,但它只是抛出一个错误(Unexpected token“=”)。谁能告诉我我做错了什么?感谢。

  var deferreds = $(".ad").map(function () {

    var t = $(this);

    $.ajax({
        type: "POST",
        url: "/Services/Services.asmx/GetBanner",
        data: "{'bannerId':" + t.attr("bannerid") + ",'siteId':" + sid + ",'dt':'" + new Date().toString() + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
    .success(function(data) {
        if (data.d.Banner != null && data.d.Banner != undefined) {
            t.html("<div class=\"featuredAd\">" + data.d.Banner + "</div>");
        }
    });
});

$.when.apply(null, deferreds.get()).then(function () {
    if($(".featuredAd").length > 0)
        $("#dvFeaturedBottom").show();
});

1 个答案:

答案 0 :(得分:0)

您没有返回承诺对象。

  var deferreds = $(".ad").map(function () {

    var t = $(this);

    return $.ajax({
        type: "POST",
        url: "/Services/Services.asmx/GetBanner",
        data: "{'bannerId':" + t.attr("bannerid") + ",'siteId':" + sid + ",'dt':'" + new Date().toString() + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
    .done(function(data) {
        if (data.d.Banner != null && data.d.Banner != undefined) {
            t.html("<div class=\"featuredAd\">" + data.d.Banner + "</div>");
        }
    });
});

$.when.apply($, deferreds.get()).then(function () {
    if($(".featuredAd").length > 0)
        $("#dvFeaturedBottom").show();
});