[英]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.