【问题标题】:Shopify Buy SDK — Add line items errorShopify Buy SDK — 添加行项目错误
【发布时间】:2018-03-12 03:50:28
【问题描述】:

我正在使用 shopify buy SDK 创建自定义店面:

  • 尝试添加订单项时出现错误
  • 下面的示例代码都可以正常工作,除非它遇到“addLineItems”方法:我检查了参数,它们看起来没问题。

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>

【问题讨论】:

    标签: javascript sdk shopify


    【解决方案1】:

    这个问题正在发生,因为 Javascript 本质上是异步的。

    您的所有调用同时执行,而不是结果。因为checkoutId, lineItemsToAdd 变量在addLineItems 执行时没有设置。

    您需要使用 Promise 来创建序列。你可以阅读它here。带有承诺的代码示例:

    <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>
    

    附:上面的代码是not supported in IE

    【讨论】:

    • 你让我很开心。完全有道理。
    • 它似乎也可以通过嵌套我的调用来工作——这是一个好主意还是坏主意?
    • 取决于您的需求。在您的示例中,您不必将所有三个调用嵌套在一个序列中。您可以并行执行前两个,然后在前两个调用完成后执行第三个。这就是我对承诺所做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2013-07-29
    相关资源
    最近更新 更多