0

所以我正在编写一个涉及一些 oauth2 的快速应用程序,最终结果是一个负责 oauth 访问令牌流的方法,因此它将执行以下操作:

  1. 如果我们没有获得访问令牌,请检查我们是否有令牌
  2. 检查令牌是否过期,如果没有,我们应该刷新它
  3. 否则返回令牌

这个伪代码通常如下所示:

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() 的承诺来获取令牌值。理想情况下,我想以某种方式说在我们有值之前不要返回令牌,但这打破了异步语句的整个目的!在这种情况下我该怎么办。

4

2 回答 2

2
 return token; #I am going return null as the promise is not done yet

不,您应该返回承诺本身。这就是承诺的工作方式。您返回承诺,然后使用您的代码可以将其他回调绑定到承诺的完成/失败回调。

于 2013-10-28T19:01:02.173 回答
1

看起来您可以从使用 WinJS 更改为使用标准 XMLHttpRequest。然后你可以让它同步而不需要使用promise。这将使您回到同步范式。

http://social.msdn.microsoft.com/Forums/windowsapps/en-US/b261daa9-5101-4538-989d-435e1681d64c/synchronous-winjsxhr-request?forum=winappswithhtml5

您可能会研究如何更好地适应异步模型,因为它将提供更好的用户体验。

于 2013-10-28T19:59:36.600 回答