簡體   English   中英

在繼續之前,我如何保證執行jQuery Every語句?

[英]How do I guarantee execution of jQuery Each statement before continuing on?

我的代碼如下:

$(".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. isItemInCart是一個帶有Ajax調用的函數
  2. updateQuantityByProductID是一個帶有ajax調用的函數
  3. addToCartWithQty是一個帶有ajax調用的函數
  4. 我不知道每個集合中有多少項(它可能會改變)

我將重構代碼,以便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_decode解碼JSON字符串。

如果您使用的是C#,您可能需要查看JSON.net

無論哪種方式,你都會有更多這樣的靈活性。 相反,在客戶端上執行每個循環時,它可能不是最佳解決方案。 Ajax調用有標題。

我的解決方案是在一次調用中整合所有這些邏輯,比如updateCart()

在客戶端,您將創建需要更新的產品列表,例如

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

此數據將發送到服務器端,會話數據將使用新數量進行更新。 基本上,服務器端的代碼將執行與您在所有單個調用中相同的邏輯,但它會更快,因為只有一個請求。

單個請求還可以降低會話鎖爭用的可能性,並提高購物車狀態的一致性。

在客戶端,只有一個回調函數的優點,而不是必須創建需要同步的單個請求的管道(讀取:屁股中的巨大痛苦)。

尋找jQuery延遲。 每個$.ajax調用都會返回一個“promise”,您可以等待解析:

var promise1 = $.ajax(...)
var promise2 = $.ajax(...)

然后等待他們解決:

$.when(promise1, promise2).then(function(){
  //ready to rumble
});

正如您所提到的,您不知道每個集合中有多少項,只需將每個promise推送到一個數組中,該數組可以在$.when ,如下所示:

var promises = [];
promises.push($.ajax(...));
$.when.apply(this, promises).then(function(){...});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM