日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SAP 电商云 Spartacus UI 的 checkout 场景中的串行请求设计分析

發布時間:2023/12/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAP 电商云 Spartacus UI 的 checkout 场景中的串行请求设计分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Current Checkout Design

When we toggle delivery method via radio input, once clicked, there’re three sequential HTTP request sent to backend:
當我們點擊 shipping method 時, 會有三個串行的 HTTP 請求發送往后臺。

這個串行請求的行為,從 Chrome 開發者工具時序圖里清晰可見。

Request1: HTTP PUT to set delivery mode

url: https://20.83.184.244:9002/occ/v2/electronics-spa/users/current/carts/00002735/deliverymode?deliveryModeId=standard-gross&lang=en&curr=USD

這個 HTTP put 請求用于修改訂單的交貨模式。

this request is triggered in delivery-mode.component.ts, method changeMode.

模式修改的觸發,從 service 類的 setDeliveryMode 開始。

The call will be delegated to service class below:

Request2: HTTP get to load [Multi Cart] Multi Cart Data

https://20.83.184.244:9002/occ/v2/electronics-spa/users/current/carts/00002735?fields=DEFAULT,potentialProductPromotions,appliedProductPromotions,potentialOrderPromotions,appliedOrderPromotions,entries(totalPrice(formattedValue),product(images(FULL),stock(FULL)),basePrice(formattedValue,value),updateable),totalPrice(formattedValue),totalItems,totalPriceWithTax(formattedValue),totalDiscounts(value,formattedValue),subTotal(formattedValue),deliveryItemsQuantity,deliveryCost(formattedValue),totalTax(formattedValue,%20value),pickupItemsQuantity,net,appliedVouchers,productDiscounts(formattedValue),user,saveTime,name,description&lang=en&curr=USD

This HTTP GET request is triggered in code: checkout.effect.ts, after previous HTTP PUT request is finished successfully:

當 HTTP PUT 執行完畢后,重新加載 Cart:

Request 3: HTTP get to load [Checkout] Checkout Details

https://20.83.184.244:9002/occ/v2/electronics-spa/users/current/carts/00002735?fields=deliveryAddress(FULL),deliveryMode,paymentInfo(FULL)&lang=en&curr=USD
trigged in checkout-details.service.ts, line 59.
When 2nd HTTP request is finished, cart is stable again, so trigger loadCheckoutDetails method.

Cart 成功加載(stable)之后,加載 checkout Detail 數據:

當前設計的缺陷

The problem of current design

Let’s have a look at checkout-delivery.service.ts.
When a user toggles the delivery mode radio input, it DOES NOT mean the HTTP GET request will be sent to backend automatically.

The semantic meaning of line 244 below is: HTTP PUT request could NOT be fired, unless both prerequisites are fulfilled:

  • Cart is stable
  • Check out loading is finished.
  • 通過 Actions 執行 setDeliveryMode 的行為是受保護的,僅當 Cart stable 并且 isLoading 為 false 時才執行:

    The happy path:
    15:42:31 355 user toggles with standard delivery mode
    15:42:31 360 since cart is stable, checkout loading is false, so fire HTTP PUT request
    15:43:31 361 HTTP PUT request is fired
    In happy path, HTTP PUT request is fired almost immediately after user clicks radio input.

    在 3G 慢速網絡下測試會出現問題。

    Test under slow 3G network, we have trouble now.

    復現場景

  • Move to delivery mode page. Standard Delivery radio input is selected.
  • Click “Premium Delivery”. Radio input is disabled – works as expected.
  • Radio input is enabled – works as expected
  • Toggle back to “Standard Delivery”.
  • Expected behavior: radio input is disabled again.
    Current behavior: radio input is NOT disabled.

    The following is time sequence after standard delivery input is clicked again ( test step 4 described above )

  • 15:45:57 User clicks “Standard delivery”
  • 15:45:57 isStable is false, since at this time, the cart load HTTP GET request for previously selected premium Delivery mode is still on the way.
  • 15:45:59 the 2nd HTTP GET request has finished.
  • 15:45:59 The 3rd HTTP GET request ( Load checkout detail )for previously selected premium Delivery mode is fired.
  • 15:45:59 two seconds passed after user clicks “Standard delivery”, but HTTP PUT request still could not be fired, since isStable = false
  • XHR log
  • Cart is stable now, isLoading = true, since 3rd HTTP GET request is still on the way.
  • 3rd HTTP GET request for previously selected premium Delivery mode has finished.
  • 15:46: 02 Cart is stable, isLoading = false. OK, now it’s time to fire HTTP PUT request for “standard delivery”.
  • Totally 5 seconds passed after user clicks “standard delivery”, unfortunately.


    Currently, we disable radio input by deliveryModeSetInProcoess$. However, its value could only be changed when there’s a HTTP PUT request sent to
    backend.

    deliveryModeSetInProcoess$ 的值只有 HTTP put 操作發送之后,才有機會被修改。

    deliveryModeSetInProcess$ = this.checkoutDeliveryService.getSetDeliveryModeProcess().pipe(map((state) => state.loading));

    而 HTTP put 有兩個外部依賴:

    As explained above, HTTP PUT request sending has two external dependencies:

  • Cart is stable
  • Checkout loading has finished.
  • This means it’s not safe to lock UI by simply using deliveryModeSetInProcess$.

    下圖紅線以上的三個請求,代表點擊 Standard Delivery 之后的 HTTP 請求。

    In general, the 1~3 HTTP requests above the red line in picture below represent the requests sent for Standard Delivery radio input click.

    下圖紅線以下的三個請求,代表點擊 Standard Delivery 之后的 HTTP 請求。

    the 1~3 HTTP requests below the red line for Premium Delivery radio input click.

    If user clicks Premimu Delivery radio input after timestamp t1, that is, after 3rd HTTP request for Standard Delivery is finished, we are safe.
    如果用戶在 t1 時間戳之后點擊 Premium Delivery,這個時候是安全的。

    Below is a happy path: t2 > t1

    Bad path:
    T0: HTTP PUT request has finished. Radio input is enabled again.
    If user clicks radio input between (t0, t1), user can toggle between radio input multiple times, however no HTTP put request would be sent( cart should be stable, checkout loading should be false )
    Based on Jerry’s observation: such HTTP put request will be queued and sent automatically until cartStable = true and checkout loading = false again.
    Any user clicks after t1 will lead to concurrent HTTP PUT request sent to backend.

    反之:在t1之前切換 input ,此時 input radio 不能被鎖住,但是點擊并不會直接觸發 HTTP PUT 操作,而是被加到隊列里。然后等 t1 到達時,這些請求像脫韁的頁碼一樣以并發的方式發送出去了。

    Time sequence of Jerry’s testing

    Test preparation: Premium Delivery is selected. Let’s say wait 20 seconds until all three HTTP request for it ( 1 PUT and 2 GET ) have finished.

    Test sequence:

  • Select “Standard delivery”. Radio input is disabled. Works as expected.
  • Wait till Radio input is enabled again. Works as expected.
  • Select “Premium delivery”. Due to issue, radio input is not disabled any more. At this time, click “Standard delivery” immediately.
  • Explain on the console.log:
    Part1: radio input is disabled. HTTP put request is sent.

    Part2: radio input is enabled again.

    Part3: 16:57:02 HTTP GET request for “standard mode” is fired.
    16:57:03 user clicks “premium delivery”. No HTTP PUT request will be sent.

    Part4: 16:57:04 “standard delivery” is selected. No HTTP put request is sent.

    Part5: Only once CartStable becomes true and isLoading becomes false, the HTTP put requests are sent now.

    并發的 HTTP put 請求本身并不會出錯,但是會導致隨后的 HTTP GET 操作返回錯誤。
    Concurrent HTTP PUT will cause errors in backend API execution:

    更多Jerry的原創文章,盡在:“汪子熙”:

    總結

    以上是生活随笔為你收集整理的SAP 电商云 Spartacus UI 的 checkout 场景中的串行请求设计分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。