Promise Chain

Error Handing - Always

by kulimusoda

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<div class="order">
  <p>尊貴的客戶您好,您上次的消費內容是:</p>
  <p>訂單編號:<span class="order-id"></span></p>
  <p>訂單內容:<span class="order-content"></span></p>
  <p>訂單金額:$<span class="order-amount"></span></p>
  <p>希望這次也能有機會服務您!</p>
</div>

<div class="overlay">
  <div class="loading">
    <div class="loading-icon"></div>
    <div class="loading-text">讀取中,請稍等...</div>
  </div>
</div>

<button id="reload">重新載入</button>

SCSS

.overlay{
  position:absolute;
  inset:0;
  backdrop-filter:blur(10px);
  display:none;
  &.active{
    display:grid;
    place-items:center;
  }
}

.loading{
  display:grid;
  gap:0.5rem;
  &-icon{
    width: 30px;
    height: 30px;
    border: 5px solid;
    border-color:#eee #aaa #aaa #aaa;
    border-radius: 50%;
    justify-self:center;
    animation: 800ms loading linear infinite;
  }
}

@keyframes loading {
  from{
    transform:rotate(0deg);
  }
  to{
    transform:rotate(360deg);
  }
}

JavaScript

const orderId = $('.order-id');
const orderContent = $('.order-content');
const orderAmount = $('.order-amount');
const reload = $('#reload');

const userApi = 'https://codelove.tw/fake-api/get-current-user-unstable';
const orderApi = 'https://codelove.tw/fake-api/get-orders-unstable';
const detailApi = 'https://codelove.tw/fake-api/get-order-details-unstable';

/* $.get(userApi).then((data) => {
  return $.get(orderApi, {
    user_id: data.data.user.id
  })
}).then((data) => {
  return $.get(detailApi, {
    order_id: data.data.orders.at(-1).id
  })
}).then((data) => {
  console.log(data.data);
  orderId.text(data.data.order.id);
  orderContent.text(data.data.order.content);
  orderAmount.text(data.data.order.amount);
}).catch((error) => {
  alert('抱歉,系統出了點問題,請稍後再試一次。');
}) */

function getOrderData() {
  const overlay = $('.overlay');
  overlay.addClass('active');

  $.get(userApi).then(res => {
    const user_id = res.data.user.id;
    console.log(user_id);
    return $.get(orderApi, {
      user_id
    });
  }).then(res => {
    const order_id = res.data.orders.at(-1).id;
    console.log(order_id);
    return $.get(detailApi, {
      order_id
    });
  }).then(res => {
    console.log(res.data.order);
    const {id,content,amount} = res.data.order;
    orderId.text(id);
    orderContent.text(content);
    orderAmount.text(amount);
  }).catch(err => {
    alert('抱歉,系統出了點問題,請稍後再試一次。');
  }).always(() => {
    overlay.removeClass('active');
  })

}

reload.click(getOrderData);

getOrderData();