【问题标题】:$.done() code gets executed before $.when()$.done() 代码在 $.when() 之前执行
【发布时间】:2013-09-05 17:36:51
【问题描述】:

在我的项目中,我使用了 2 个版本的 JQuery.js,因此我使用 $.noConflict() 将我的最新版本的 JQuery 与名为 jq172 的变量解决了冲突。现在我已经使用jq172.when().done()construct 来显示加载状态图像,直到所有 ajax 请求都被完全处理。代码如下。

jq172.when(
    DisplayPOXOrderStatistics(fromDate, toDate), 
    DisplayPOXCompletedOrdersData(fromDate, toDate),
    DisplayPOXCompletedOrderPieChart(fromDate, toDate),
    DisplayCurrentYearlyTrends())
      .done(function (a1,a2,a3,a4) 
        { 
           $("#loading").hide(); 
        });

其中jq172.when()中的函数编码如下,

 function DisplayPOXOrderStatistics(fromDate, toDate) {        
    return $.ajax({
        type: "POST",
        url: '@Url.Action("DisplayPOXOrderStatistics", "Home")',
        dataType: "json",
        data: { FromDate: fromDate, ToDate: toDate },
        success: function (data) {application code.....}
    });        
}
function DisplayPOXCompletedOrdersData(fromDate, toDate) {
    return $.ajax({
        type: "POST",
        url: '@Url.Action("DisplayPOXCompletedOrders", "Home")',
        data: { FromDate: fromDate, ToDate: toDate },
        dataType: "json",
        success: function (data) { some code....}
    });
    }

&rest 2个函数的编码方式同上 现在我在.done() 中隐藏加载图像潜水的代码应该在所有 4 个 ajax 调用完成后执行,但目前它在函数调用被调度后立即执行。任何人都可以找出我的代码中的问题。 提前致谢...

这里是rest 2函数的定义..

function DisplayPOXCompletedOrderPieChart(fromDate, toDate) {
    return $.ajax({
        type: "POST",
        url: '@Url.Action("POXCompletedOrderPieChart", "Home")',
        data: { FromDate: fromDate, ToDate: toDate },
        dataType: "json",
        success: function (data) {
            $('#POXCompletedOrdersPie').empty();
            var dataSet = [];
            var isDataAvailable = false;
            for (var i = 0; i < data.length ; i++) {
                var newElement = { label: data[i].Name, data: parseFloat(data[i].ColumnValue), color: Color[i] };
                dataSet.push(newElement);
                if (newElement.data > 0)
                    isDataAvailable = true;
            }
            if (dataSet.length != 0 && isDataAvailable) {
                $.plot($("#POXCompletedOrdersPie"), dataSet, {
                    series: {
                        pie: {
                            show: true
                        }
                    },
                    legend: {
                        show: false
                    }
                });
            }
            else {
                $("#POXCompletedOrdersPie").empty();
                $("#POXCompletedOrdersPie").append("<html><p> <b>" + "@Html.Raw(VirtuOxAdvDME.Dashboard_PieChart_POXCompletedOrder_NoData)" + "</b> </p><html>");
            }
        }
    });        
}

function DisplayCurrentYearlyTrends() {
    $("#DisplayCurrentYear").html($('#selectCurrentYear option:selected').text());
    return $.ajax({
        url: '@Url.Action("DisplayCurrentYearlyTrends", "Home")',
        data: { selectedCurrentYear: $('#selectCurrentYear option:selected').text() },
        type: 'POST',
        dataType: 'json',
        success: function (data) {
            var DataValues = [], TickData = [];
            var i = undefined;
            $.each(data, function (index, item) {
                i = (index + 1) * 2;
                DataValues.push({ data: [i, item.Value], color: Color[i] });
                DataValues.push([i, item.Value]);
                TickData.push([i, item.MonthName]);
            });
            $.plot($("#CurrentYearlyTrendsBar"), [{ data: DataValues, color: "#3D69AA" }],
                    {
                        series: { bars: { show: true } },
                        bars: {
                            barWidth: 1.5,
                            align: "center"
                        },
                        xaxis: {
                            ticks: TickData,
                            axisLabelUseCanvas: true,
                            labelAngle: -90,
                        },
                        yaxis: { axisLabelUseCanvas: true },
                        grid: { hoverable: true }
                    });
            $("#CurrentYearlyTrendsBar").UseTooltip();
        }
    });        
}

【问题讨论】:

  • 你不保持简单有什么原因吗?我的意思是,您特别想在同一行代码中使用两个版本的 jquery?
  • 如果你使用最新版本的 jQuery 是否可以正常工作....比如$.when 而不是jq172.when
  • @Daedalus & Arun;实际上,旧版本的 jquery 正在从其他脚本中使用,并且在删除旧版本时,我遇到了脚本错误。所以我保留了 .js 并使用 var jq172=$.noConflict(); 解决了冲突;
  • 改用jq172.ajax() (尽管我希望when 能够处理任何承诺)。其他 jQuery 的版本是什么?
  • @Bergi,我使用的旧版本是 1.4.4 和更高版本是 1.7.2。我需要在当前上下文中将所有 $ 运算符替换为 jq172 吗?

标签: javascript jquery ajax .when


【解决方案1】:

可能您的$.ajax 调用(来自旧的jQuery 版本)不会返回实现Promise 接口的jqXHR objects,这是v1.5 引入的一个特性。 when 会将对象视为普通值并立即解析。

要解决此问题,请改用 jq172.ajax(),或使用(单个)最新的 jQuery 并更新您的旧代码。

【讨论】:

  • 感谢建议,我使用 jquery 迁移脚本切换到最新版本的 jquery。现在我在我的 jquery.jqGrid.js 和 jquery.flot.js 文件中得到 $.browser is undefined 错误;所以我正在寻找替代方案。如果您能为这个新问题提出一些建议,我将非常感谢您。然后我可以查看我原来的 $.when().done() 问题。
  • 检查 stackoverflow.com/questions/15540835/… 以获得快速的'n'dirty修复,但您应该避免浏览器检测。
  • 感谢您的支持;你的解决方案对我有用。 $.browser is undefined 错误不是切换到最新版本的 jquery 的问题,因为我包含了 jquery 的迁移脚本;我收到这个错误是因为我的队友更新了项目的布局页面以包含所有 jquery 版本的脚本包。我删除了脚本包,现在一切正常。谢谢...
【解决方案2】:

这是来自jquery site

在多个延迟的情况下,其中一个延迟被拒绝,jQuery.when 立即为其主延迟触发失败回调。请注意,此时某些 Deferreds 可能仍未解决。如果您需要针对这种情况执行额外的处理,例如取消任何未完成的 ajax 请求,您可以在闭包中保留对底层 jqXHR 对象的引用,并在 failCallback 中检查/取消它们。

检查您的 ajax 调用并确保没有人被拒绝。
您可以在 开发者控制台->网络标签
一般按 F12 后就可以访问了。

【讨论】:

  • 嗨 Parv,没有一个 ajax 请求被拒绝。所有都在成功功能中执行并正常工作。
  • 能否请您发布 DisplayCurrentYearlyTrends() 和 DisplayPOXCompletedOrderPieChart() 的代码
  • 请查看功能定义的编辑问题。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
相关资源
最近更新 更多