簡體   English   中英

間隔發出請求的更優雅,更有效的方法是什么?

[英]What's the more elegant and efficient way to make a request at intervals?

我目前正在對API進行一些更改,這里的問題是我們從另一台服務器請求數據,但是為了服務器處理我們的請求,為了安全起見,我們首先要求他們提供AccessToken,如果令牌有效並且仍然有效(這些標記持續2秒鍾,對不起,我不知道如何用英語正確放置它,對不起),然后一切都很好,如果標記不正確,我們將不會向他們提出任何要求。

這里的情況是,現在API在不先請求令牌的情況下發出了請求,並且如果當前令牌(由於啟動API時,它會請求令牌)無效,則它會捕獲錯誤並請求新的令牌然后再次發出請求。

我不喜歡 如果我每兩秒鍾請求一個新令牌而不是捕獲一個錯誤,那將變得更加簡單明了。

如何以一種優雅而有效的方式完成此任務? 我現在能想到的最基本的形式是通過使用計時器每兩秒鍾在一個自執行函數中放置一個promise。 但是我認為這不是最好的方法。 有什么建議么?

我在這里花了兩美分:您可以跟蹤從UTC檢索到當前令牌的時間(例如,從UTC檢索到的毫秒數)或從系統啟動時獲得的納秒,因此您可以在發送請求之前根據其到期時間檢查它是否仍然有效。 如果已經過期,則只需在發送請求之前拉一個新的請求,即可保存請求/響應記錄。 有關令牌的信息(例如此類令牌在過期之前的時間)可以與令牌本身一起傳遞,具體取決於傳輸協議或數據格式。 所有這些都可以在單個線程(或單個線程組)中處理,並且只有在需要它們時您才能獲取新令牌,從而節省了客戶端和服務器的帶寬。

希望這對您有所幫助。

輪詢確實沒有什么特別優雅的。 也不需要不斷地改變他們的系統,索要令牌。

一個更優雅的解決方案是合並一些功能性多態性以及遞歸和/或鏈接。

const handleInvalidToken = (request, token, data) => err => 
  invalidTokenErr(err)
    ? getNewToken().then(token => request(token, data))
    : Promise.reject(err);

const handleSomeRequest = (token, data) =>
  doAThing(token, data)
    .catch(handleInvalidToken(doAThing, token, data));


handleSomeRequest(userData.token, request.body)
  .then(handleSuccess)
  .catch(handleCatastrophicFailure);

現在,您已經擁有了所有瘋狂的,笨拙的代碼,將其變成了簡單的函數和高階函數,應該清楚地理解它們,並清楚地映射控制流。

暫無
暫無

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

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