[NODEJS] 중첩 된 약속을 제거
NODEJS중첩 된 약속을 제거
해결법
-
1.모든 다음 콜백에서, 당신은 새로운 약속을 반환해야합니다 :
모든 다음 콜백에서, 당신은 새로운 약속을 반환해야합니다 :
exports.viewFile = function(req, res) { var fileId = req.params.id; boxContentRequest('files/' + fileId + '/content', req.user.box.accessToken) .then(function(response) { return boxViewerRequest('documents', {url: response.request.href}, 'POST'); }) .then(function(response) { return boxViewerRequest('sessions', {document_id: response.body.id}, 'POST'); }) .then(function(response) { console.log(response); }); };
그 때는 () 호출에 의해 반환되는 약속은 그래서 당신은 쉽게 체인들을 수는 "내부"약속의 값으로 해결됩니다.
일반 패턴 :
somePromise.then(function(r1) { return nextPromise.then(function(r2) { return anyValue; }); }) // resolves with anyValue || \||/ \/ somePromise.then(function(r1) { return nextPromise; }).then(function(r2) { return anyValue; }) // resolves with anyValue as well
-
2.Promise.prototype.then은 당신이 그들을 체인 수 있도록하는 것이 또 다른 약속을 반환하도록 설계되었습니다.
Promise.prototype.then은 당신이 그들을 체인 수 있도록하는 것이 또 다른 약속을 반환하도록 설계되었습니다.
그 때는 전달 핸들러 함수는 () 숫자 나 문자열 또는 개체처럼 정상적인 값을 반환 할 수 있으며,이 값이 그 때는의 다음 핸들러로 전달 얻을 것이다 ().
하나의 옵션은 boxViewerRequestSync는 응답 객체를 반환하는 동기 함수가 될 것입니다 :
boxContentRequest('files/' + fileId + '/content', req.user.box.accessToken) .then(function(response) { return boxViewerRequestSync('documents', {url: response.request.href}, 'POST') }) .then(function(response) { // this `response` is returned by `boxViewerRequestSync` return boxViewerRequestSync('sessions', {document_id: response.body.id}, 'POST') }) .then(function(response) { console.log(response); })
그러나 물론 당신의 boxViewerRequest는 비동기 대신 약속을 반환합니다. 이 경우, 핸들러 함수는 완전히 무관 약속을 리턴 할 수있다) (그 때는 전달. 이 새로운 약속은 동 기적으로 실행되고, 문제가 해결되면 / 거부, 그 결과는 다음 핸들러에 전달됩니다.
boxContentRequest('files/' + fileId + '/content', req.user.box.accessToken) .then(function(response) { return boxViewerRequest('documents', {url: response.request.href}, 'POST') }) .then(function(response) { // this `response` is the result of resolving the promise returned by `boxViewerRequest` return boxViewerRequest('sessions', {document_id: response.body.id}, 'POST') }) .then(function(response) { console.log(response); })
모든 약속의 유지 트랙 혼란,하지만 결론은 이것이다 : Promise.prototype.then 항상 약속 개체를 반환하지만 Promise.prototype.then에 전달 핸들러 함수는 아무것도, 심지어 정의되지 않은 반환 또는 다른 약속 할 수 . 그런 다음 그 값, 또는 해결 약속의 값은, 다음 핸들러 함수에 전달됩니다.
from https://stackoverflow.com/questions/21999178/removing-nested-promises by cc-by-sa and MIT license
'NODEJS' 카테고리의 다른 글
[NODEJS] package.json에서 물결표 (~)와 캐럿의 차이 (^)은 무엇입니까? (0) | 2020.09.16 |
---|---|
[NODEJS] Node.js를 + Nginx에 - 지금 무엇? (0) | 2020.09.16 |
[NODEJS] 어떻게 HTTP POST 요청은 Node.js를 이루어집니다? (0) | 2020.09.16 |
[NODEJS] 어떻게 Node.js를에 Express.js에서 GET GET (쿼리 문자열) 변수? (0) | 2020.09.16 |
[NODEJS] 어떻게 POST 쿼리 매개 변수를 검색? (0) | 2020.09.16 |