最近我在使用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的原创文章,请关注公众号"汪子熙":
相关推荐
async/await 是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await 是基于 Promise 实现的,它不能用于普通的回调函数。 async/await 与 Promise 一样,是非阻塞的。 async/await 使得异步代码看...
使用Async和Await进行,异步编程,适用于vs2015平台,此案例
使用 async 和 await 改写 todos.zip。使用 async 和 await 改写 todos.zip。使用 async 和 await 改写 todos.zip。
网上摘抄的简单实例,可能网上找得到。我这里就直接把代码弄出来 大家单步执行,既能知道async和await的用法
async/await异步处理
async和await用法
C#5.0 中async 和await 两个关键字,这两个关键字简化了异步编程
async和await用法 async和await的用法
异步编程趋于同步 利用async和await调用wcf服务
在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await。 同样本文的内容也大多是翻译的,只不过加上了自己的理解进行了相关知识点的补充,如果你认为自己的英文水平还不错,大可...
Promise Async+await实现原理及案例分析
Python3.5中async_await特性的实现.pdf
为文章 Async Await 异常处理 所写,主要展示四种典型情况下的异常处理。 async await; task.wait(); async 不 await; async void
通过这门课程能学习如何使用 ES2017 中的 `async/await` 特性编写出相比于 `promise chain` 和 `callback hell` 更容易阅读理解的代码。`await` 关键字接收一个 `promise`,终止代码的执行,直到 `promise` 状态变为...
JavaScript中async,await的使用和方法 JS中 async函数和await 关键字 function hellworld() { return "您好!美好世界!"; } console.log(hellworld()); // 您好!美好世界! async function asyHellworld()...
EA Async在JVM中实现Async-Await方法。 它允许程序员以顺序的方式编写异步代码。 它在很大程度上受到.NET CLR上Async-Await的启发,有关更多信息,请参见进行。 谁应该使用它? 应该使用EA Async编写非阻塞异步...
针对.net异步编程(async await)使用入门的一些讲解
Example for binding an ObservableCollection to a ListView and using async await Task to update the data
vue3 使用async await