0

データテーブルの各行に対してページ メソッドを呼び出したいコードがあります。各行にはユーザー情報が含まれており、page メソッドは特定の期間におけるそのユーザーに関する追加データを探します。そのようなデータが存在する場合、アイデアは、データを新しい行として現在の行に追加することです。そのようなデータが存在しない場合は、次の行に進みます。

コードを次のように開始します。

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

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

まず、ページ メソッドを使用して開始日と終了日を取得します。これはうまくいきます。次に、テーブル内の各データ行に対してメソッドを呼び出そうとします。

    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 呼び出しが実行され、ここに問題があります。呼び出しは行われますが、すべての行の呼び出しが完了するまで、成功関数もエラー関数も呼び出されません。次に、各行に対して success メソッドが呼び出されますが、必要なデータが失われています。

各 ajax リクエストに対して success 関数が呼び出されるようにコードを再構築するにはどうすればよいですか?

洞察をお寄せいただきありがとうございます。

4

1 に答える 1

1

jquery からの Ajax 呼び出しはデフォルトで非同期であるため、成功または失敗する前に、いくつかの呼び出しがすべて開始される可能性があります。それらを同期させたい場合はasync: false、パラメーターとして追加する必要があります。

また、同時に2つの非同期リクエストに制限されています。これも、ここでの要因だと確信しています。

これは最適なアーキテクチャとは思えません。すべてのデータを単一のリクエストに結合し、配列またはコレクションを処理できるように WebService/PageMethod を設定してみませんか? これはより単純なアーキテクチャであり、行ごとに 1 つのリクエストよりもはるかに優れたパフォーマンスを発揮します。

配列を渡すには、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 シリアライザーのようなものを使用してみませんか?

于 2011-03-01T17:30:35.583 に答える