2016-11-28 2 views
3

기능을 기다리고 있습니다 -> 약속 -> 비동기/await를 -> 비동기/await를 -> 비동기/await를잡기 오류는/내가 같이 보입니다 콜백 <code>node 4.3</code> 스크립트 함수 체인을

같은 :

const topLevel = (resolve, reject) => { 
    const foo = doThing(data) 
    .then(results => { 
     resolve(results) 
    }) 
    .catch(err => { 
     reject(err) 
    }) 
} 

async function doThing(data) { 
    const thing = await doAnotherThing(data) 
    return thing 
} 

async function doAnotherThing(data) { 
    const thingDone = await etcFunction(data) 
    return thingDone 
} 

etcFunction()가 발생하는 경우 (이 모든 방법을 통해 async/await없는 이유는 최고 수준의 함수는 태스크 큐 라이브러리이며, 표면 상 async/await 스타일 실행할 수 없다는 것입니다) 01 않습니다.거품이 최상위 수준까지 올라갑니다 Promise?

그렇지 않은 경우 어떻게 거품을 쓸 수 있습니까? errors? 각 awaittry/catchthrow에 포장해야합니까? etcFunction()가 발생하는 경우

async function doAnotherThing(data) { 
    try { 
    await etcFunction(data) 
    } catch(err) { 
    throw err 
    } 
} 
+0

'makePromise' 란 무엇입니까? – Bergi

+0

"최상위 함수는 작업 대기열 라이브러리이며 표면적으로 async/await 스타일을 실행할 수 없습니다 *"- 대기열 라이브러리가 작업과 같이 비동기 함수를 사용할 수없는 이유는 없습니다. 콜백을 다루지 않아도됩니다. 콜백 스타일을 사용하는 특정 큐 라이브러리를 사용해야하는 경우에는 래퍼 (wrapper) 함수를 사용하십시오. – Bergi

+0

@Bergi'makePromise'는 실제로'async' 함수입니다.하지만'async'가 아닌 환경에서 호출 되었기 때문에 저는 그것을 약속처럼 다루고 있습니다. 다시 : 나는 동의 할 것이고, 나는 약속 할 것이다 .- 결국 그것은 가능할 것이다. 그러나 나는 믿을 수없는 오류가 평균 시간 안에 버블 링 될 수 있는가? – Brandon

답변

2

async function의를 통해 오류 거품까지 모든 방법을합니까?

예. 가장 바깥 쪽 기능에 의해 반환 된 약속은 거부됩니다. try { … } catch(e) { throw e; }을 할 필요가 없습니다. 동기식 코드만큼이나 무의미합니다.

... 최고 수준의 약속까지 거품이 터지십니까?

번호 topLevel에 여러 번 실수가 있습니다. then 콜백에서 returndoThing(data)을받지 않으면 무시되며 (심지어 기다리지도 않음) 거부가 처리되지 않은 상태로 유지됩니다.

function toplevel(onsuccess, onerror) { 
    makePromise() 
    .then(doThing) 
    .then(onsuccess, onerror); 
} 

불필요한 기능 식, 더 .then(…).catch(…) antipattern (즉 모두onsuccessonerror으로 이어질 수 없었다 : 당신은

.then(data => { return doThing(data); }) 
// or 
.then(data => doThing(data)) 
// or just 
.then(doThing) // recommended 

을 사용해야합니다 그리고 일반적으로, 함수는 다음과 같이한다 불리다).