2016-11-13 35 views
5

Gram z kilkoma różnymi sposobami łączenia kolekcji funkcji i nie mogę znaleźć takiego, który szczególnie mi się podoba. Następna jest ostatnia, na której się zdecydowałem, ale nadal jej nie lubię.Łańcuchowe obietnice w wodospadzie

Czy ktoś może zaproponować bardziej przejrzysty i zwięzły wzór? Nie chcę wybierać Async.js ani biblioteki.

[ 
    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. wszelkie inne wskazówki są mile widziane.

Odpowiedz

5

Znaleziony to rozwiązanie na StackOverflow, w jaki sposób można dynamicznie obietnice łańcuchowe:

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

Cały post jest tutaj: https://stackoverflow.com/a/30823708/4052701

+0

ładny i czysty. Dzięki! – ddibiase

+0

Hmmm, właśnie wypróbowałem to z moją implementacją, wygląda na to, że zostało uproszczone, ponieważ przeniosło obietnicę generowania do poszczególnych funkcji. Zastanawiasz się, czy istnieje coś, co całkowicie tego unika. Na razie to jednak zrobi =) – ddibiase

+0

To jest piękne :) – robinmitra

2

Co ES7 asynchroniczny/Oczekujcie? Dziwne/stare powiązanie (to) w kodzie, ale nie należy mylić z przykładem.

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

lub bardziej ogólne

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

Tak, zdecydowanie wolałbym robić to w ten sposób. Jeszcze nie dotknąłem ES7, boję się uaktualnić nasz kod. Wiązanie jest tam, ponieważ nie nauczyłem się nowego/lepszego wzorca do odwoływania się do metod klasy w mojej klasie. W tym przypadku connectDatabase jest metodą wewnątrz mojej klasy, która używa odwołań do dodatkowych metod w klasie. Jeśli nie wiążę wywołania metody z tym, to traci to kontekst. Propozycje? – ddibiase

+0

Czy możesz podzielić się pracą sandbox? Co jeśli nie chcę słuchać, jeśli connectServer się nie powiedzie? – codeofnode

+0

@codeofnode Zaktualizowałem swoją odpowiedź, dodając try-catch. Twoje ostatnie pytanie może być wykonane przez otaczanie metody connectServer przez try-catch: try {czekaj this.connectServer.bind (this);} catch (e) {// nie rzucaj, aby kontynuować}. Jeśli nie chcesz czekać na connectServer, możesz usunąć oczekiwanie. –