2015-02-12 50 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