javascript - Shopify 购物车 AJAX 请求返回不一致
问题描述
我正在尝试一键将 2 件商品发布到购物车。我已经建立了一个带有隐藏复选框的表单,这些复选框带有我需要这样做的相关产品属性。我有一个循环遍历表单的子复选框以提取该信息并为发布请求调用该函数。
问题是有时它确实添加了两个项目(耶!)但有时它只会加载第一个项目,有时只加载第二个项目。控制台中没有错误代码可供我关闭,所以我想知道我错过了什么。
编辑:19 小时后。我认为问题出在打开购物车的功能,该购物车在返回第一个项目时触发。两个调用都成功返回,但该代码正在中断它被添加到购物车。
编辑2:这篇文章描述了我遇到的问题。我需要提出一个请求,然后继续下一个请求。我想我将不得不用表单中的项目构建一个数组。
我的JS
const freeAddOnForm = document.getElementById('free-addon-form'),
freeAddOnButton = freeAddOnForm[2];
function getDataForm(e) {
e.preventDefault();
loadingBarTrigger('start');
for(let i = 0; i < 2; i++) {
itemAdd(
freeAddOnForm[i].getAttribute('data-quickadd-id'),
freeAddOnForm[i].getAttribute('data-quickadd-properties'),
(freeAddOnForm[i].getAttribute('data-quickadd-quantity'))
? freeAddOnForm[i].getAttribute('data-quickadd-quantity')
: 1,
(!html.is('#cart')) ? true : false,
(html.is('#cart')) ? true : false
)
}
}
document.addEventListener('DOMContentLoaded', function (){
freeAddOnButton.addEventListener('click', getDataForm, false);
})
向购物车发出 post 请求的 itemAdd 函数:
const itemAdd = (variantId, properties, qty, openCart, reloadPage) => {
$.ajax({
type: 'POST',
dataType: 'html',
url: `/cart/add.js`,
data:
{
id: variantId,
quantity: qty,
properties: (properties)
? JSON.parse(properties) : null
},
error: function(data) {
console.error(data);
loadingBarTrigger('done');
},
success: function() {
loadingBarTrigger('move');
$.ajax({
url: '/cart',
dataType: 'html',
error: function(data) {
console.error(data);
loadingBarTrigger('done');
},
success: function(data) {
let minicartContent = $('#minicart-content');
let cartItemsHtml = $(data).find('#cart-content #cart-items').html();
// insert or prepend cart HTML
(minicartContent.find('#cart-items').length)
? minicartContent.find('#cart-items').html(cartItemsHtml)
: minicartContent.prepend(cartItemsHtml);
// remove giftbox content if exists
(minicartContent.find('#cart-giftbox .item-info').length)
? minicartContent.find('#cart-giftbox .item-info').remove()
: '';
loadingBarTrigger('done');
cartTotalUpdate();
// open cart
(openCart && !html.is('#cart'))
? minicartTrigger.trigger('click') : '';
(reloadPage)
? location.reload() : '';
}
});
}
});
}
解决方案
最后将这两个项目作为对象放入一个数组中,并将它们一起发送到 Shopify AJAX api。似乎可行,在功能结束时用滑出推车敲出几个小错误。
const itemsAddAjax = (itemsQueue, openCart, reloadPage) => {
console.log(itemsQueue)
$.post(`/cart/add.js`, {
items: [
{
quantity: itemsQueue[0].qty,
id: itemsQueue[0].id,
properties: (itemsQueue[0].properties)
? JSON.parse(itemsQueue[0].properties) : null
},
{
quantity: itemsQueue[1].qty,
id: itemsQueue[1].id,
properties: (itemsQueue[1].properties)
? JSON.parse(itemsQueue[1].properties) : null
}
],
error: function(items) {
// console.error(items);
loadingBarTrigger('done');
},
success: function() {
loadingBarTrigger('move');
$.ajax({
url: '/cart',
dataType: 'html',
error: function(items) {
console.error(items[0]);
loadingBarTrigger('done');
},
success: function(items) {