所以我正在编写一个涉及一些oauth2的快速应用程序,最终结果是负责oauth访问令牌流的方法,因此它将执行以下操作:
pesudo代码通常如下所示:
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
中获得的访问代码作为其异步(我可以返回该承诺)。这引出了我的问题。我不想在某种asychnronus声明中包含我所做的每一个请求!我需要访问令牌在应用程序中执行任何其他操作,但是我无法从访问令牌中获取明确的值,直到创建了承诺。 (Surley这意味着我需要在.then()或.done()语句中包装调用此函数的每个函数。)
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
}
这是obvoius不是很好,因为我不能只返回令牌的值,因为它依赖于来自test()的promise来获取令牌值。理想我想要某种方式说不要返回令牌,直到我们有一个值,但这打破了异步语句的整个目的!在这种情况下我该怎么做。
答案 0 :(得分:2)
return token; #I am going return null as the promise is not done yet
不,你应该自己回复承诺。这就是承诺的工作方式。您返回承诺,然后使用您的代码可以将其他回调绑定到promise的完成/失败回调。
答案 1 :(得分:1)
看起来您可以从使用WinJS更改为使用标准XMLHttpRequest。然后你可以使它同步,不需要使用promise。这将带您回到同步范例。
您可能会考虑如何更好地融入异步模型,因为它将提供更好的用户体验。