所以我正在编写一个涉及一些 oauth2 的快速应用程序,最终结果是一个负责 oauth 访问令牌流的方法,因此它将执行以下操作:
- 如果我们没有获得访问令牌,请检查我们是否有令牌
- 检查令牌是否过期,如果没有,我们应该刷新它
- 否则返回令牌
这个伪代码通常如下所示:
if token == null
token = getAccessToken() //I am going block the app until I get my token kthxbi
if expired(token)
token = refreshAcessToken() //I am going block the app until I refresh my token kthxbi
return token
这样,当我调用此方法时,我知道我总是被返回一个有效的令牌。我遇到的问题是要获取访问令牌或刷新它,我们需要使用承诺。其代码通常如下所示:
getAccessToken() {
return WinJS.xhr({ type: "post", url: "i am a url rawr",
responseType: "json", data: data}).done(
function do stuff(){});
}
我知道我不能只返回我在函数中获得的访问代码do stuff
作为它的异步(但是我可以返回那个承诺)。这导致了我的问题。我不想将我所做的每个请求都包含在某种异步语句中!我需要访问令牌才能在应用程序中执行任何其他操作,但是在创建承诺之前,我无法从访问令牌中获得确定的值。(Surley 这意味着我需要将调用此函数的每个函数包装在 .then() 或 .done() 语句中)。
有人可以对此有所了解。我的记录是我的 handleOAuth 现在看起来像这样
this.getToken = function() {
if (token === null) {
//test is a function that makes a xhr request to the server
test().done(
function complete(result) {
token = JSON.parse(result.responseText);
lastTokenTime = getTokenExpiry(token['expiry']);
},
function error(error) {
console.log(JSON.stringify(serializedData));
console.log(error.innerText);
}
);
//refresh
return token; #I am going return null as the promise is not done yet
}
这显然不是很好,因为我不能只返回令牌的值,因为它依赖于 test() 的承诺来获取令牌值。理想情况下,我想以某种方式说在我们有值之前不要返回令牌,但这打破了异步语句的整个目的!在这种情况下我该怎么办。