簡體   English   中英

觀看 API 以獲取更新

[英]Watch an API for Updates

我正在嘗試制作 API 手表到https://api.exchangeratesapi.io/latest並檢測是否有任何更改,以便我可以像 Z2567A5EC9705EB7AC2C984033E0618D 通知一樣更新我的客戶。 但我正在做的是

while(true){
    fetch(https://api.exchangeratesapi.io/latest)
    .then(res => ......
}

我正在緩存結果並始終檢查是否有任何更改,如果有,我將向客戶端發送請求。
我正在尋找一種更好的方法來提取數據而不是進行 while 循環

如果您使用while循環,您可能會在一個返回之前發送許多請求。 甚至當一個人回來時,它也不一定是有序的。 這是一個簡單的示例,說明如果出現網絡峰值可能會發生什么,例如:

 const sleep = ms => new Promise(res => setTimeout(res, ms)); async function mockNetworkCall(num) { const timings = [50, 150, 50] console.log(`sending request ${num}`); await sleep(timings[num]); console.log(`request ${num} finished`) } for(let i = 0; i < 3; i++) { mockNetworkCall(i); }

如果您改為采用僅在最后一個請求完成時執行新請求的方法,則可以避免while循環。 在這種情況下,您在任何時候都只會有一個請求處於活動狀態,並且您知道您正在按順序獲得結果。

您可以將其邏輯包裝在一個簡單的 function 中以觀察 URL 並僅在前一個請求完成時重新發起請求。 這是這樣一個 function 的骨架 - 它可能需要根據您的需要進行調整:

function watch({ url, retryCount, lastResponse = null}) {
  fetch(url)
    .then(res => { 
      
      /* do something */
      
      return res;
    })
    .then(res => watch({url, retryCount, lastResponse: res})) //launch again
    .catch(err => { 
      /* handle error */ 
      console.error("error getting URL", err);
      console.warn("retries left: ", retryCount);
      
      if (retryCount-- > 0) {
        watch({url, retryCount, lastResponse});
      }
    })
}

watch({url: "google.com", retryCount: 3});

或者同樣使用async/await

async function watch({ url, retryCount, lastResponse = null}) {
  try {
    const res = await fetch(url);

    /* do something */
    
    watch({url, retryCount, lastResponse: res}); //launch again
  } catch (err) {
    /* handle error */ 
    console.error("error getting URL", err);
    console.warn("retries left: ", retryCount);
      
    if (retryCount-- > 0) {
      watch({url, retryCount, lastResponse});
    }
  }
}

watch({url: "google.com", retryCount: 3});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM