如何使用async和await這對組合設計統一的取Access Token的函式
最近我在使用SAP雲平臺的機器學習API做和SAP系統的整合,因為SAP Cloud Platform Leonardo上的機器學期API,每次消費時需要傳一個Access Token,故在每次實際呼叫API前,我需要先發一個請求去獲取Access Token. 該請求的響應,除了返回實際的token外,還有一個過期時間,expires_in欄位:
根據OAuth 2.0標準定義,expires_in欄位代表伺服器頒發的該token,距離過期時間還剩的秒數。
我的程式碼如下:
const request = require('request-promise-native');
var config = require('../config.js');
var TOKEN = undefined;
var EXPIRES_IN = undefined;
var TOKEN_FETCHED_SINCE = undefined;
function isCurrentDateExpired(){
var current = new Date();
var diffInMilliSeconds = current - TOKEN_FETCHED_SINCE;
var diffInSecond = Math.ceil(diffInMilliSeconds/1000);
var expired = diffInSecond >= EXPIRES_IN ? true:false;
// for debug;
// expired = true;
return expired;
}
async function getAccessToken(){
if( TOKEN === undefined || isCurrentDateExpired()){
var raw = new Buffer(config.username + ":" + config.password);
const accessToken = await request({
method: 'GET',
headers: {
'Authorization': 'Basic ' + raw.toString('base64')
},
url: config.ACCESS_TOKEN,
json: false
});
var oToken = JSON.parse(accessToken);
EXPIRES_IN = oToken.expires_in;
TOKEN = oToken.access_token;
TOKEN_FETCHED_SINCE = new Date();
return oToken.access_token;
}
else{
return TOKEN;
}
}
var request1 = getAccessToken();
var freshNewToken, secondTimeToken;
request1.then(function(o){
// console.log("token1: " + o);
freshNewToken = o;
});
function test2(){
var b = getAccessToken();
b.then(function(o){
// console.log("token2: " + o);
secondTimeToken = o;
console.log("they should be equal: " + (freshNewToken == secondTimeToken));
});
}
setTimeout( test2, 6000);
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2658626/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript非同步程式設計–Generator函式、async、awaitJavaScript非同步程式設計函式AI
- async和await的使用AI
- vue中非同步函式async和await的用法Vue非同步函式AI
- async、await和generator函式內部原理AI函式
- generator函式與async/await函式AI
- Generator與Promise的完美結合 -- async await函式誕生記PromiseAI函式
- async和await的使用總結 ~ 竟然一直用錯了c#中的async和await的使用。。AIC#
- 10個必備的 async/await 工具函式AI函式
- Flutter非同步程式設計-async和awaitFlutter非同步程式設計AI
- node傳統讀取檔案和promise,async await,PromiseAI
- JavaScript非同步程式設計史:回撥函式到Promise到Async/AwaitJavaScript非同步程式設計函式PromiseAI
- js的curry和函式組合JS函式
- async await函式效能與Promise併發AI函式Promise
- 如何正確使用async/await?AI
- 如何講清楚async和await?AI
- JavaScript 中的函數語言程式設計:函式,組合和柯里化JavaScript函數程式設計函式
- 非同步程式設計之Async,Await和ConfigureAwait的關係非同步程式設計AI
- 極簡設計模式-函式組合和集合管道模式設計模式函式
- 如何把 golang 的 Channel 玩出 async 和 await 的 feelGolangAI
- async和awaitAI
- 回撥函式到promise再到理解async/await函式PromiseAI
- Oracle 分組彙總統計函式的使用Oracle函式
- access_token和refresh_token的區別
- 區間統計 聚合函式組合器函式
- python教程:使用 async 和 await 協程進行併發程式設計PythonAI程式設計
- 理解函數語言程式設計中的函式組合--Monoids(二)函數程式設計函式Mono
- Vue中async await的使用示例VueAI
- Promise && async/await的理解和用法PromiseAI
- 停止像這樣使用 "async/await",改用原版AI
- 如何更好的編寫async函式函式
- 【翻譯】如何在React中使用async/await (componentDidMount Async)ReactAI
- JavaScript async await 使用JavaScriptAI
- 【Azure Developer】使用 Microsoft Authentication Libraries (MSAL) 如何來獲取Token呢 (通過使用者名稱和密碼方式獲取Access Token)DeveloperROS密碼
- 好程式設計師web前端培訓分享如何講清楚async和await?程式設計師Web前端AI
- async和await的錯誤捕獲AI
- 微信Access Token 快取方法快取
- JS 函式式概念: 管道 和 組合JS函式
- JS 非同步發展流程(回撥函式=>Async/await)JS非同步函式AI