jquery 1.5 Ajax-запросы, через отложенный объект, к PageMethod не выполняется должным образом - PullRequest
0 голосов
/ 01 марта 2011

У меня есть некоторый код, в котором я хочу вызвать метод страницы для каждой строки в таблице данных.Каждая строка содержит информацию о пользователе, а метод страницы ищет дополнительные данные об этом пользователе за определенный период времени.Если такие данные существуют, идея состоит в том, чтобы затем добавить данные в качестве новой строки в текущую строку.Если таких данных не существует, перейдите к следующей строке.

Я начинаю свой код с:

        $.when(GetStartDate(), GetEndDate())
            .then(function () {                    
                GetSchedules();

            })
            .fail(function () {
                failureAlertMsg();
            })

Сначала я получаю даты начала и окончания с помощью методов страницы.Это отлично работает.Затем я пытаюсь вызвать метод для каждого datarorow в таблице:

    function GetSchedules() {
        $('.DataRow').each(function () {
           GetUserSchedule($(this));
        });
    }

Это работает без проблем.Я передаю текущую строку данных в новую функцию:

    var currDataRow;
    var currUserID;

    function GetUserSchedule(dr) {
        currDataRow = dr;
        currUserID = currDataRow.find('td').eq(0).text().trim();
        $.ajax({
            type: "POST",
            url: "mypagewithjqueryurl.aspx/GenerateUserSchedule",
            data: "{'StartDate':'" + startDate + "', 'EndDate':'" + endDate + "', 'UserID':'" + currUserID +"'}",    //params
            contentType: "application/json",
            dataType: "json",
            success: function () {
                alert('Succeeded');
            },
            error: AjaxFailed
        });
    }

Когда я выполняю пошаговое выполнение кода, функция вызывается для каждой строки, currDataRow и currUserID заполняется, как и ожидалось, и вызов ajaxвыполнил и вот где проблема кроется.Вызов сделан, но ни функции успеха, ни ошибки не вызываются до тех пор, пока вызовы не будут завершены для всех строк.Затем вызывается метод успеха для каждой строки, но необходимые данные были потеряны.

Как я могу реструктурировать свой код так, чтобы функция успеха вызывалась для каждого запроса ajax?

Заранее спасибодля любого понимания.

1 Ответ

1 голос
/ 01 марта 2011

Ajax-вызовы из jquery по умолчанию являются асинхронными, поэтому вполне вероятно, что несколько вызовов будут инициированы до того, как какой-либо из них завершится успешно или не удастся. Если вы хотите, чтобы они были синхронными, вам нужно добавить async: false в качестве параметра.

Вы также ограничены двумя асинхронными запросами одновременно, что также, я уверен, является фактором здесь.

Это не похоже на лучшую архитектуру - почему бы не объединить все данные в один запрос и настроить ваш WebService / PageMethod так, чтобы он мог обрабатывать массив или коллекцию? Это более простая архитектура, которая также будет выполнять намного лучше, чем один запрос на строку.

Чтобы передать массив, в C # вы должны сделать что-то подобное в вашем методе:

using System.Runtime.Serialization;
...

        [Serializable]
        class Data {
           DateTime StartDate; 
           DateTime EndDate;
        }

    // or really any serializable IEnumerable
        public static MyMethod(string data) {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Data[] data = (Data[])serializer.Deserialize(data); 
            foreach (Data item in data) {
              // do stuff
            }
        }

в Javascript, создайте свой массив (или объект), например,

    var dates = Array();
    // loop
    var datestruct = {
      StartDate: startDate,
      EndDate: endDate 
    }
    dates[index]=dateStruct;
    // end loop

затем для data: в вашем $ .ajax:

$.toJSON(dates)

Вы также можете построить строку вручную, как сейчас, скобки [] обозначают элементы массива. например,

"{['StartDate':'"+startDate+"','EndDate':'"+endDate+"'],['StartDate ... ]}"

но почему бы не использовать что-то вроде сериализатора JSON, которое сделает это за вас?

...