2016-12-07 42 views
2

最近我接受承諾鏈接模式。這是非常方便,這樣做:promisifying js方法如何避免邏輯重複?

action1 
.then(()=> action2()) 
.then(()=> action3()); 

但是,爲了做到這一點,我改變了所有的方法是這樣的(打字稿):

action1() : Promise<any>{ 
    try{ 
    // actual code 
    return Promise.resolve(); 
    } catch (err){ 
    console.error(err); 
    return Promise.reject(err); 
    } 
} 

這看起來很重複模式。避免代碼重複的最佳方法是什麼?

+0

這幾乎沒有什麼意義。爲什麼當你的'//實際代碼'是同步的時候你會使用promise? – Bergi

+0

@Bergi,對。但是我仍想鏈接它 –

+0

只需使用'action3(action2(action1()))'鏈接同步函數?或者使用函數組合。你絕對不應該使用同步代碼的承諾。 – Bergi

回答

2

編寫一個函數在一個函數來包裝的承諾,你可以重複使用它

wrapPromise(fun) : Promise<any>{ 
    try{ 
    var value = fun() 
    return Promise.resolve(value); 
    } catch (err){ 
    console.error(err); 
    return Promise.reject(err); 
    } 
} 


wrapPromise(action1).then() 
+0

是的,沒錯。但是人們確實喜歡這樣嗎?最佳做法是什麼? –

+1

@PavelEvdokimov最好的做法是不要使用同步代碼的承諾... – Bergi

0

由於您使用的打字稿,你需要使用async/await。簡單地做

async action1(): Promise<any>{ 
    try { 
    return // actual code; 
    } catch (err){ 
    console.error(err); 
    throw err; 
    } 
} 

但是有你其實並不想抓住,登錄並重新拋出在每一個功能都錯誤的好機會,所以這簡化爲

async action1(): Promise<any>{ 
    return // actual code; 
} 
+0

這只是從2.0開始的,對吧? –

+0

鏈接的網站說1.7。 – Bergi

+0

@Bergi僅限於ES6。 –