为什么这个jQuery循环不是每次都触发?

Why isn't this jQuery loop not firing every time?

提问人:cx3700 提问时间:4/4/2023 最后编辑:cx3700 更新时间:4/4/2023 访问量:46

问:

我有一个页面(Woocommerce 中的产品类别),上面有 12 种产品。每个产品都有一个数量字段,当您单击页面底部的按钮时,它会循环浏览产品并将数量大于零的任何产品添加到购物车中:

$('.add-products').on('click', function() {
    $('.product-qty').each(function() {
        if ($(this).val() > 0) {
            var pid = $(this).closest('.product-select').attr('product-id');
            var qty = $(this).val();
            add_to_cart(pid, qty);
        }   
    });
});

添加到购物车功能如下所示:

function add_to_cart(product_id, qty) {
    $.ajax({
        type: "POST",
        url: '/wp-admin/admin-ajax.php',
        data: {action : 'add_to_cart', 'product_id': product_id, 'qty': qty},
        success : function(response) {
            console.log(product_id + ": " + qty);
        }, error : function(response) {
            // throw error
        }
    });
}

问题是,如果我在一堆产品上设置数量,比如说其中四种,它会随机将一些添加到购物车中,而不是其他产品。我尝试使 add_to_cart() 异步,我尝试使用 setTimeouts() 让它有时间运行,但无论我做什么,它都不会将所有数量为 > 0 的产品添加到购物车中。在 add-to_cart() 函数内部,它会回显成功回调中的所有产品,但它们最终不会进入实际购物车。

有没有更好的方法可以做到这一点?

我尝试使add_to_cart()异步,我尝试使用setTimeouts()让它有时间运行。我浏览了此处和谷歌的搜索结果,但没有找到答案。

jQuery WordPress 循环 每个 购物车

评论

0赞 Phil 4/4/2023
“他们最终不会进入实际的购物车”......这是什么意思?实际购物车是什么/在哪里?听起来像是服务器端问题,因为我没有看到此代码或您所说的记录有任何问题
0赞 cx3700 4/4/2023
它是woocommerce购物车。它们记录为已添加,但是当我转到 /cart 时,它们中只有一些随机存在,就像该函数只是触发了几次然后停止一样。
0赞 cx3700 4/4/2023
我将尝试一次性将一系列产品发送到 PHP,并在 PHP 中循环。
0赞 cx3700 4/4/2023
菲尔:我认为你是对的,PHP是同步的,所以我认为它很恶心。我将所有产品作为数组发送到购物车并在 PHP 中循环,它有效。
0赞 Phil 4/4/2023
PHP 的单个请求处理是单线程的,但您的 Web 服务器可以发送与配置为处理的任意数量的同时请求。如果你的PHP代码受到竞争条件的影响,那么它应该得到改进。同样,这与客户端代码无关。如果您有多个不同的客户同时添加到购物车怎么办?

答:

0赞 mplungjan 4/4/2023 #1

不建议循环使用 ajax。

假设您可以更改服务器端处理,您可以改为这样做:

$('.add-products').on('click', function() {
  const products = [];
   $('.product-qty').each(function() {
    if ($(this).val() > 0) {
        var pid = $(this).closest('.product-select').attr('product-id');
        var qty = $(this).val();
        products.push({pid, qty});
    }   
  });
  if (products.length > 0) addToCart(products)
});

并将 addToCarts 更改为将对象作为 JSON 字符串发送到服务器

评论

0赞 Phil 4/4/2023
这难道不完全取决于服务器端代码期望的格式吗?我觉得这不是一个完整的答案
0赞 mplungjan 4/4/2023
@Phil 这是他的服务器。如果不是,那么我的答案当然会错过服务器部分。但是看到OP在我写这篇文章时写的评论,他们可以更改服务器以接受他们需要的任何东西