1

我以前没有使用过延迟,但我在这里和那里读过一些关于它们的内容,据我了解,听起来它们可以解决我当前遇到的问题。我有一个页面必须加载 4 个广告。以前,由于服务器为每个广告查询数据库需要时间,因此页面速度变慢。因此,我将横幅广告调用移至 Web 服务。这很好用,但是如果我没有广告,我需要隐藏容器 div,这意味着我需要知道所有 ajax 调用何时完成,然后检查是否加载了任何广告。

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

  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();
});
4

1 回答 1

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();
});
于 2012-08-08T20:47:27.690 回答