2015-02-12 47 views
0

我创建采用以下形式的方法的方法:创建调用一个承诺或完成一个动作迅速

login() { 
    var token = this.cookieManager.getCookie("token"); 

    if(!token) 
    { 
    client.post(url, data).then(response => { 
     this.accessToken = response.content; 
    }); 
    } 
    else 
    { 
    this.accessToken = token; 
    } 
} 

我可以马上看到的问题是,该令牌路径可以拿!一段时间,所以我的登录方法应该返回一个承诺。问题是如何处理其他路径?

我可以创建并返回一个承诺,但这个承诺不会有任何实际的返回值,除非硬编码的'成功'。这看起来很奇怪,所以还有另一种方法来处理这种情况?

+0

你应该将它作为* accessToken的一个承诺 - 这就是你的'login'函数基本获得的。无论如何,当你无法知道它是否在那里时,无需将它存储在一个属性上。 – Bergi 2015-02-12 11:13:39

回答

1

else路径可以返回已经解决的诺言。所以这两条路径都返回一个承诺在一种情况下,它已经解决,在另一种情况下,它将在异步操作完成时解决。在这两种情况下,主叫方只需在承诺上使用.then()即可。

0

您忘了返回第一个承诺,所以您的方法似乎与消费者同步。如果你的方法是异步的,你必须从所有的代码路径返回的承诺,包括投掷的:

login() { 
    try { 
    var token = this.cookieManager.getCookie("token"); 

    if(!token) 
    { 
     return client.post(url, data).then(response => { 
     this.accessToken = response.content; 
     }); 
    } 
    else 
    { 
     this.accessToken = token; 
    } 
    return Promise.resolve(); 
    } catch (e) { 
    return Promise.reject(e); 
    } 
} 

最有希望的库包括一个帮助,使这个非常简单:

login() { 
    return Promise.try(_ => { 
    var token = this.cookieManager.getCookie("token"); 

    if(!token) 
    { 
     return client.post(url, data).then(response => { 
     this.accessToken = response.content; 
     }); 
    } 
    else 
    { 
     this.accessToken = token; 
    } 
    }) 
} 
2

正如@Esailija已经提到,如果你的函数是异步的(在这种情况下返回promise),它必须总是返回promise。在ES7 async关键字完全是为此目的而存在的。但是,直到ES7可以garantee这种行为只是包装你的代码Promise.resolve().then(() => {})建设:

login() { 
    return Promise.resolve().then(() => { 
    var token = this.cookieManager.getCookie("token"); 

    if (token) { 
     return this.accessToken = token; 
    } 

    return client.post(url, data).then(response => { 
     return this.accessToken = response.content; 
    }); 
    }); 
} 

现在login方法也返回accessToken,我认为它更清晰。任何将在回调内传递给then的错误都将拒绝承诺。

+0

其实你的代码不工作,因为它缺少'else'。你*不希望总是返回'client.post(...)'。 – Bergi 2015-02-12 17:03:54

+0

@Bergi Ooh。谢谢,现在它工作。 – alexpods 2015-02-12 17:35:05