복붙노트

[NODEJS] 중첩 된 약속을 제거

NODEJS

중첩 된 약속을 제거

해결법


  1. 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. 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에 전달 핸들러 함수는 아무것도, 심지어 정의되지 않은 반환 또는 다른 약속 할 수 . 그런 다음 그 값, 또는 해결 약속의 값은, 다음 핸들러 함수에 전달됩니다.

  3. from https://stackoverflow.com/questions/21999178/removing-nested-promises by cc-by-sa and MIT license