2016-10-25 8 views
0

나는 나를위한 유일한 선택이 서로 내에서 어떤 약속을 중첩하는 것이라고 생각하는 상황이 있습니다. 약속이 완료 될 때까지 무언가를하는 방법과 수행해야 할 약속이 있습니다. 이런 식으로 뭔가는 다음 fetchValue 방법의 then 성명에서, 나는 다른 방법 I가 지금중첩 된 약속을 구조화하는 방법

let promise = new Promise((resolve, reject) => { 

    fetchValue(url) 
    .then((value) => { 

     // Do something here 

    }).catch((err) => { 
     console.error(err); 
    }); 

}); 

doSomethingUntilPromiseisDone(promise); 

그러나 :

let promise = new Promise((resolve, reject) => { 

    // Do some stuff 

}); 

doSomethingUntilPromiseisDone(promise); 

하지만, 내 약속에서, 나는 다른 약속을 돌려 다른 방법을 실행해야

let promise = new Promise((resolve, reject) => { 

    fetchValue(url) 
    .then((value) => { 

     saveToCache(value) 
     .then((success) => { 

      console.log('success!!'); 
      resolve('success'); 

     }); 

    }).catch((err) => { 
     console.error(err); 
    }); 

}); 

doSomethingUntilPromiseisDone(promise); 

그래서 결국, 나는 내 약속에서, 약속이있다 : 즉, 무엇을 추측 실행해야 또 다른 약속을 반환 약속. 내가 더 잘 구성 할 수 있도록 어딘가에 있나요? Promise의 의도 된 연결 방식에 맞춰 서로를 중첩시키는 것 같습니다.

+0

이 보이는을 평평하게 generator를 사용할 수는 약속과 함께 백업을 호출 - 왜 그냥 콜백을 대신 사용 하시겠습니까? – Soren

+0

어디에서'resolve()'를 호출합니까? – guest271314

+1

'got '메소드는 어디에 있습니까? – thefourtheye

답변

5

사용 .then()

let doStuff = (resolve, reject) => {/* resolve() or reject() */}; 
let promise = new Promise(doStuff); 
doSomethingUntilPromiseisDone(
    promise 
    .then(value => fetchValue(url)) 
    .then(value => value.blob()) 
    .then(saveToCache) 
) 
.then(success => console.log("success!!")) 
.catch(err => console.error(err)) 
+0

이미 화살표 구문을 사용하고 있다면 왜 아직도'return'을 사용하고 있습니까? –

+0

@Derek 朕 會 功夫 좋은 지적. 'doSomethingUntilPromiseisDone'이 필요한지 확실하지 않은가요? – guest271314

+1

포맷팅이 잘못되어'doSomethingUntilPromiseisDone' 전에 공백을 추가했습니다. 나는 그것이 실제로 무엇인지 모른다. –

0

당신이 당신의 중첩 된 약속 (Bluebird.couroutine 또는 Generators) 당신이 코드를 비동기하려고하는 것처럼

//Bluebird.couroutine 
const generator = Promise.coroutine(function*() { 
    try { 
    const value = yield fetchValue(url); 
    const success = yield saveToCache(value); 
    console.log('success:', success); 
    } catch(e) { 
    console.error(err); 
    }  
})); 

generator(); 
관련 문제