javascript麻烦了解windows 8的承诺

时间:2013-10-28 18:49:12

标签: javascript

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

  1. 如果我们没有获得访问令牌,请检查我们是否有令牌
  2. 检查令牌是否已过期,否则我们应该刷新它
  3. 否则返回令牌
  4. 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()语句中包装调用此函数的每个函数。)

    有人可以对此有所了解。我的perdicument是我的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
        }
    

    这是obvoius不是很好,因为我不能只返回令牌的值,因为它依赖于来自test()的promise来获取令牌值。理想我想要某种方式说不要返回令牌,直到我们有一个值,但这打破了异步语句的整个目的!在这种情况下我该怎么做。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

您可能会考虑如何更好地融入异步模型,因为它将提供更好的用户体验。