Php 使用AJAX将多个项目添加到购物车,只处理一个项目
我有一个购物车,购物车中添加了AJAX请求。请求发送到Laravel 5.4。当我依次缓慢地单击多个“添加到购物车”按钮时,一切正常。那么AJAX请求就不会同时执行。但是,当我快速地依次单击这些按钮时,AJAX请求将同时执行,并且只有一个项目被添加到购物车中 jQuery: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(
$('.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请求。”