2016-11-13 9 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

Hmmm, 내 구현으로 시도했지만, 약속 생성을 개별 기능으로 옮겼 기 때문에 단순화 된 것처럼 보입니다. 완전히 피할 수있는 것이 있는지 궁금합니다. 지금은 이것을 할 것입니다 =) – 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를 기다리지 않으려면 기다리는 것을 제거 할 수 있습니다. –