我有一个购物车,其中的项目添加了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
});
});
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([]);
}
当我在我的AJAX请求中使用async: false
时,无论我添加多快,所有项目都会添加到购物车中。但由于该选项已被弃用,因此使用它并不合适。我也看过像Promises这样的替代品,但我不知道如何在我的情况下使用它们。
我试图弄清楚为什么在多个项目之后快速添加多个项目时只处理一个项目。希望你们能帮助我!
答案 0 :(得分:0)
也许可以在js-code中收集项目然后将它们传递给ajax。
jQuery:
$('.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 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([]);}
答案 1 :(得分:0)
您似乎可以使用public class Power10Scale
{
private static readonly int[] Pow10s = {
1, 10, 100, 1000, 10000, 100000,
};
public static int Up(int value, int places)
{
return Scale(value, places, (x, y) => x * y);
}
public static int Down(int value, int places)
{
return Scale(value, places, (x, y) => x / y);
}
private static int Scale(int value, int places, Func<int, int, int> operation)
{
if (places < Pow10s.Length)
return operation(value, Pow10s[places]);
return Scale(
operation(value, Pow10s[Pow10s.Length - 1]),
places - (Pow10s.Length - 1),
operation);
}
}
库来阻止Laravel覆盖您的会话数据。我没有使用它,但它声称可以解决您遇到的确切问题。