Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用AJAX将多个项目添加到购物车,只处理一个项目_Php_Jquery_Ajax_Laravel - Fatal编程技术网

Php 使用AJAX将多个项目添加到购物车,只处理一个项目

Php 使用AJAX将多个项目添加到购物车,只处理一个项目,php,jquery,ajax,laravel,Php,Jquery,Ajax,Laravel,我有一个购物车,购物车中添加了AJAX请求。请求发送到Laravel 5.4。当我依次缓慢地单击多个“添加到购物车”按钮时,一切正常。那么AJAX请求就不会同时执行。但是,当我快速地依次单击这些按钮时,AJAX请求将同时执行,并且只有一个项目被添加到购物车中 jQuery: $('.add-to-cart').on('click', function (event) { // Get the product/service ID. var item = $(this).attr(

我有一个购物车,购物车中添加了AJAX请求。请求发送到Laravel 5.4。当我依次缓慢地单击多个“添加到购物车”按钮时,一切正常。那么AJAX请求就不会同时执行。但是,当我快速地依次单击这些按钮时,AJAX请求将同时执行,并且只有一个项目被添加到购物车中

jQuery:

$('.add-to-cart').on('click', function (event) {
    // Get the product/service ID.
    var item = $(this).attr('data-id');

    $.post('/cart', {
        action: 'addItem',
        data: item
    }, 'json').done(function (response) {
        // Hide .add-to-cart and show .go-to-checkout
    });
});
$('.add-to-cart').on('click', function (event) {
var items = {COLLECT_ITEMS_FUNCTION};
$.post('/cart', {
    action: 'addItems',
    data: items
}, 'json').done(function (response) {
    // Hide .add-to-cart and show .go-to-checkout
});});
PHP:

public function addItem(Request $request)
{
    // Get item from request.
    $item = $request->get('data');

    // Store item in session.
    $request->session()->push('cart.items', [$item]);

    // Return JSON response.
    return response()->json([]);
}
public function addItems(Request $request) {
$items = $request->get('data');

foreach ($items as $item) {
    // Store item in session.
    $request->session()->push('cart.items', [$item]);
}

// Return JSON response.
return response()->json([]);}
当我在AJAX请求中使用
async:false
时,所有项目都会添加到购物车中,无论我添加它们的速度有多快。但由于该选项已被弃用,因此使用它感觉不正确。我也研究过承诺等替代方案,但我不知道如何在我的案例中使用它们


我试图弄明白为什么在多个项目快速添加时,只处理一个项目。希望你们能帮助我

也许可以在js代码中收集项目,然后将它们传递给ajax

jQuery:

$('.add-to-cart').on('click', function (event) {
    // Get the product/service ID.
    var item = $(this).attr('data-id');

    $.post('/cart', {
        action: 'addItem',
        data: item
    }, 'json').done(function (response) {
        // Hide .add-to-cart and show .go-to-checkout
    });
});
$('.add-to-cart').on('click', function (event) {
var items = {COLLECT_ITEMS_FUNCTION};
$.post('/cart', {
    action: 'addItems',
    data: items
}, 'json').done(function (response) {
    // Hide .add-to-cart and show .go-to-checkout
});});
PHP:

public function addItem(Request $request)
{
    // Get item from request.
    $item = $request->get('data');

    // Store item in session.
    $request->session()->push('cart.items', [$item]);

    // Return JSON response.
    return response()->json([]);
}
public function addItems(Request $request) {
$items = $request->get('data');

foreach ($items as $item) {
    // Store item in session.
    $request->session()->push('cart.items', [$item]);
}

// Return JSON response.
return response()->json([]);}

似乎可以使用
laravel锁定会话
库来防止laravel覆盖会话数据。我没有使用过它,但它声称可以解决您遇到的确切问题


您在js中的
变量设置在哪里?您可能正在为同一
项目
值发送多个请求。您还可以尝试查看Chrome或Firefox开发工具中的网络选项卡,以查看您发送的请求数据。忘记将其放入示例代码中了,谢谢注意。“item”变量只是产品/服务的ID,没有什么特别的。我在Chrome中使用了Networks标签,看到每个请求都包含一个不同的ID,就像它应该包含的一样。真的有必要快速添加项目吗?您可以在处理请求时禁用
.add to cart
按钮。我假设您已检查了开发工具中的“网络”选项卡,以确保您的请求已发送。请查看此库:。“它解决了由于并发请求同时更新会话而导致会话数据丢失的问题。可能发生这种情况的一个实例是同时发出XHR请求。”