2016-11-13 145 views
5

我一直在玩一些鏈接功能集合的不同方式,似乎無法找到我特別喜歡的一個。以下是我最後決定的一個,但我仍然不熱衷於此。鏈接承諾瀑布

有人可以建議一個更清潔和更簡潔的模式?我不想選擇Async.js或庫。

[ 
    this.connectDatabase.bind(this), 
    this.connectServer.bind(this), 
    this.listen.bind(this) 
].reduce(
    (chain, fn) => { 
    let p = new Promise(fn); 
    chain.then(p); 
    return p; 
    }, 
    Promise.resolve() 
); 

Ps。任何其他技巧都比歡迎。

回答

5

上找到計算器這個解決方案如何,你可以鏈的承諾動態:

iterable.reduce((p, fn) => p.then(fn), Promise.resolve()) 

完整的職位是在這裏:https://stackoverflow.com/a/30823708/4052701

+0

尼斯和清潔。謝謝! – ddibiase

+0

嗯,只是嘗試了我的實現,看起來像它被簡化了,因爲它將承諾生成轉移到單個函數中。想知道是否有什麼可以完全避免。現在,這將通過=) – ddibiase

+0

這是美麗:) – robinmitra

2

什麼ES7異步/ AWAIT? 您的代碼中存在奇怪/舊的綁定(this),但不要與您的示例混淆。

async function x() { 
    try { 
     await this.connectDatabase.bind(this); 
     await this.connectServer.bind(this); 
     await this.listen.bind(this); 
    } catch(e) { 
     throw e; 
    } 
} 

或多個通用

async function() { 
    for (let item of yourArray) { 
     try { 
      await item.bind(this); //strange bind of your code. 
     } catch(e) { 
      throw e; 
     } 
    } 
} 
+0

是的,我更喜歡這樣做。還沒有觸及ES7,害怕升級我們的代碼庫。綁定在那裏,因爲我沒有學到一個新的/更好的模式來引用我的類中的類方法。在這種情況下,connectDatabase是我的類中的一個方法,然後使用對類中其他方法的引用。如果我沒有將方法調用綁定到此,則會丟失它的上下文。建議? – ddibiase

+0

你能分享一些工作沙箱嗎?如果我不想偵聽connectServer是否失敗,該怎麼辦? – codeofnode

+0

@codeofnode我通過添加try-catch來更新我的答案。你最後一個問題可以通過try-catch包圍connectServer方法完成:try {await this.connectServer.bind(this);} catch(e){//不要繼續}。如果您不想等待connectServer,則可以刪除await。 –