Я использую Shopify Buy SDK, чтобы создать пользовательскую витрину:

  • Я получаю ошибку при попытке добавить элемент строки
  • Пример кода ниже всех работ, за исключением случаев, когда он попадает в метод «AddLineTems»: я проверил параметры, и они кажутся нормальными.
shopify.checkout.create().then((checkout) => {
  checkoutId = checkout.id
  console.log('checkout id: ' + checkoutId) // Works OK
})

shopify.product.fetchAll().then((products) => {
  lineItemsToAdd = [
    {variantId: products[0].variants[0].id, quantity: 1}
  ]
  console.log('line items to add: ' + lineItemsToAdd) // Works OK
})

shopify.checkout.addLineItems(checkoutId, lineItemsToAdd).then((checkout) => {
  console.log('checkout line items: ' + checkout.lineItems)
}) // Throws error

И ошибка, которую я получаю:

index.js?7327:3705 Uncaught (in promise) TypeError: Cannot read property 'checkoutLineItemsAdd' of undefined
at eval (index.js?7327:3705)
at <anonymous>
2
Aleks Witko 12 Мар 2018 в 06:50

1 ответ

Лучший ответ

Проблема происходит, потому что JavaScript является асинхронизацией по природе.

Все ваши звонки выполняются одновременно и не в результате. Из-за этого переменных checkoutId, lineItemsToAdd не устанавливаются при выполнении addLineItems.

Вам нужно использовать обещания для создания последовательности. Вы можете прочитать об этом Здесь. Пример вашего кода с обещанием:

<script>

const client = ShopifyBuy.buildClient({
  domain: '-----------------------',
  storefrontAccessToken: '--------'
});
var checkoutPromise = client.checkout.create()
var productPromise = client.product.fetchAll()


Promise.all([checkoutPromise,productPromise]).then(([checkout,products]) => 
{
    var lineItemsToAdd = [
        {variantId: products[0].variants[0].id, quantity: 1}
      ]
    var checkoutId = checkout.id

    console.log('checkout id: ' + checkoutId)       
    console.log('line items to add: ' + lineItemsToAdd)

    client.checkout.addLineItems(checkoutId, lineItemsToAdd).then((checkout) => {
        console.log('checkout line items: ' + checkout.lineItems)
    })
})
</script>

Снимание Код выше - не поддерживается в IE

3
Victor Leontyev 12 Мар 2018 в 13:24