3

私のコードは次のとおりです。

$(".qtyfield").each(function (index) {
    if (this.value != "" && this.value > 0) {
        var fieldname = this.id;
        countme = countme + 1;
        var tmpProductID = fieldname.split("_")
        var ProductID = tmpProductID[1];
        var ShowPrice = $(this).closest('td').prev('td').text();
        var Quantity = this.value;
        ShowPrice = ShowPrice.replace("$", "");
        isItemInCart(ProductID).done(function () {
            if (isItemInCartVar) {
                updateQuantityByProductID(ProductID, Quantity);
            }
            else {
                addToCartWithQty(ProductID, ShowPrice, Quantity);
            }

        });
        this.value = '';
    }
});

さらにステートメントを実行する前に、このコード ブロックが完了する (すべての ajax 呼び出しが含まれる) ことを確認する必要があります。

いくつかのポイント..

  1. isItemInCartAjax Call を使用する関数です
  2. updateQuantityByProductIDajax呼び出しを伴う関数です
  3. addToCartWithQtyajax呼び出しを伴う関数です
  4. 各コレクションにいくつのアイテムがあるかわかりません (変更される可能性があります)
4

3 に答える 3

2

私の解決策は、このすべてのロジックを のような単一の呼び出しに統合することですupdateCart()

クライアント側では、更新が必要な製品のリストを作成します。たとえば、

[
  {productId: 123, quantity: 2, price: 123},
  {productId: 456, quantity: 1, price: 200}
]

このデータはサーバー側に送信され、そこでセッション データが新しい数量で更新されます。基本的に、サーバー側のコードは、個々のすべての呼び出しと同じロジックを実行しますが、リクエストが 1 つしかないため、はるかに高速になります。

また、単一のリクエストにより、セッション ロックの競合の可能性が減り、カートの状態の一貫性が向上します。

クライアント側では、同期が必要な個々のリクエストのパイプを作成する代わりに、コールバック関数が 1 つしかないという利点があります (お尻の大きな痛みを読んでください)。

于 2013-09-10T09:20:37.177 に答える
2

eachループがサーバー側になるようにコードをリファクタリングします。このようにして、クライアントで配列を準備し、(一意の呼び出しを使用して) ajax で送信し、eachループが発生するサーバーで展開できます。 各ループが数十億の要素で構成されている場合はどうなるでしょうか? それに html ヘッダーの長さを掛けます。

代わりに、このように配列を準備することができます。

var serverSide = [];

$(".qtyfield").each(function (index) {

    serverSide.push("the data you need");

});

その後、JSON 文字列として送信できます

var myArg = JSON.stringify(serverSide)

またはカンマ区切りのリスト (より単純な構造の場合)

var myArg = serverSide.join(',');

任意の値/エラーメッセージを返すことができる一意の ajax 呼び出しがあります

$.post("link", myArg).success(function(data){ alert("data"); })

どのサーバー側のサポートがあるかはわかりませんが、PHP を使用している場合は、.json で JSON 文字列をデコードできますjson_decode

C# を使用している場合は、JSON.netを参照してください。

いずれにせよ、このようにはるかに柔軟になります。逆に、クライアントで each ループを実行することは可能ですが、それは最善の解決策ではありません。Ajax 呼び出しにはヘッダーがあります。

于 2013-09-10T09:11:34.610 に答える