Код $.done() выполняется перед $.when()

В моем проекте я использую 2 версии JQuery.js, поэтому я решил конфликт, используя $.noConflict() для моей последней версии JQuery с переменной с именем jq172. Теперь я использовал jq172.when().done()Конструкция для отображения изображения состояния загрузки до полной обработки всех запросов 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....}
    });
    }

& остальные 2 функции кодируются так же, как и выше. Теперь мой код в .done() чтобы скрыть загрузку изображения, погружение должно выполняться после того, как все 4 вызова ajax завершены, но в настоящее время оно выполняется сразу после отправки вызова функции. Кто-нибудь может выяснить проблему в моем коде. Заранее спасибо...

Вот определение остальных 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();
        }
    });        
}

2 ответа

Решение

Вероятно, ваш $.ajax вызовы (из старой версии jQuery) не возвращают объекты jqXHR, которые реализуют интерфейс Promise, функция, которая была введена в v1.5. when будет видеть объекты как простые значения и сразу разрешать.

Чтобы это исправить, используйте jq172.ajax() вместо этого или используйте (один) актуальный jQuery и обновите свой прежний код.

Это с сайта jquery

в случае множественных отсрочек, когда один из отложенных отклоняется, jQuery.when немедленно запускает failCallbacks для своего главного отложенного элемента. Обратите внимание, что некоторые из отложенных могут все еще быть неразрешенными в этой точке. Если вам нужно выполнить дополнительную обработку для этого случая, например, отменить любые незаконченные запросы ajax, вы можете хранить ссылки на базовые объекты jqXHR в замыкании и проверять / отменять их в failCallback.

проверьте ваши AJAX-звонки и убедитесь, что никто не получает отказ.
Вы можете сделать это в консоли разработчика-> вкладка сети
обычно становится доступным после нажатия F12.

Другие вопросы по тегам