2016-10-21 2 views
0

중첩 된 약속을 피하기 위해 다음을 어떻게 최적화 할 수 있습니까? 그것은 작동하지만 마치 중첩 약속을 계속할 것 같습니다.중첩 된 약속 최적화

코드가 먼저 서비스를 인증하고 반환하면 API를 비동기 적으로 호출하여 해당 항목을 가져 오는 함수에 해당 서비스를 제공합니다.

new Promise(function(resolve, reject) { 
    auth.authenticate(resolve); 
}).then(function(service) { 
    console.log('service', service); 
    new Promise(function(resolve, reject) { 
     lineItems.getLineItems(service, resolve, reject); 
    }).then(function(items) { 
     console.log('returned line items'); 
     console.log(items); 
    }).catch(function(err){ 
     console.log('error!', err); 
    }); 
}); 
+1

이 코드 :

auth.authenticate() .then((service) => lineItems.getLineItems(service)) .then((items) => console.info('Items:',items)) .catch((err) => console.error(err)); 

auth.authenticate 및/또는 lineItems.getLineItems 외부 경우, 표준 nodejs callbak/errback 스타일을 따라, 당신은 약속을 반환하는이 기능을 래핑 할 수 당신이 [return] (http://stackoverflow.com/questions/37081508/resolving-an-array-of-promises-from-within-a-parent-promise/37084467#37084467)을하지 않기 때문에 오류가 발생하기 쉽습니다. 두 번째 약속. – jib

답변

1

그냥 then에서 새 약속을 반환 :

new Promise(function(resolve, reject) { 
    auth.authenticate(resolve); 
}).then(function(service) { 
    console.log('service', service); 
    return new Promise(function(resolve, reject) { 
     lineItems.getLineItems(service, resolve, reject); 
    }); 
}).then(function(items) { 
    console.log('returned line items'); 
    console.log(items); 
}).catch(function(err){ 
    console.log('error!', err); 
}); 

을 또한,이 프로를 반환 할 lineItems.getLineItems을 조정할 수있는 경우 이후의 항목은, 아마 비동기 호출을 포함하는 다른 함수를 호출 더 간결 해 보입니다.

new Promise(function(resolve, reject) { 
    auth.authenticate(resolve); 
}).then(function(service) { 
    console.log('service', service); 
    return lineItems.getLineItems(service); 
}).then(function(items) { 
    console.log('returned line items'); 
    console.log(items); 
}).catch(function(err){ 
    console.log('error!', err); 
}); 
+0

이런 식으로 약속을 만들고 해결/거부를 ​​기능에 전달하는 것이 좋은 습관입니까? 또는 내가 처음에 약속이라고 부르는 기능이 더 낫습니까? – darkace

+2

'lineItems.getLineItems'이 당신에 의해 설계 되었다면, IMO는'resolve'와'reject'를 거기에 전달하기 위해 중복됩니다. 당신은 단지'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 그래서'return new Promise (function (resolve, ...) '대신 lineItems.getLineItems (service);를 돌려 줄 수 있습니다. –

+0

당신이 대답에 그것을 추가 할 수 있다면 받아 들일 것입니다 :) – darkace

1

주로 함수 정의 방법에 대한 몇 가지 문제점을 참조하십시오. 이것은 실제로 코드에 정의 된 비표준 함수의 비표준 시그니처에서 비롯됩니다.

auth.authenticatelineItems.getLineItems이 작성된 경우 적절한 Promise를 반환하려면이 함수를 업데이트하십시오. 그런 다음 구성은 다음과 같습니다

const authenticate = Promise.promisify(auth.authenticate, {context:auth}); 
const getLineItems = Promise.promisify(lineItems.getLineItems,{context:lineItems}); 

authenticate() 
    .then(getLineItems) 
    .then((items) => console.info('Items:',items)) 
    .catch((err) => console.error(err));