2014-07-14 3 views
0

체인 :배관 데이터 I Q는 약속 체인있어

Q(initialCall).then(someOtherCallThatUsesResultsFromPreviousResults) 

호출은 일반적 promisified Node.js를 http.get 외부 REST API에 대한 호출을 의미한다. 경로는 이전 호출의 정보를 사용하여 구성됩니다. 동시에 이전 호출의 정보도 파이프 처리하려고합니다. 체인의 최종 결과는 두 호출의 데이터가 하나의 객체로 병합되어야합니다. 현재 정보 전달은 추가 매개 변수 인 객체를 통해 명시 적으로 수행됩니다. 명시 적으로 추가 매개 변수를 전달하지 않아도되는 방법은 무엇입니까?

function jsonRequest(pathThatIsContructedBasedOnPreviousResults, object:any) { 
    var deferer = Q.defer(); 
    var options = capsuleOptions; 
    options.path = path; 

    https.get(options, function (response) { 
     response.on('data', function (d) { 
     var parsedJson = JSON.parse(d); 
     deferer.resolve({data: parsedJson, object: object}); 
     })}).on('error', function(e) {deferer.reject(e);}); 

    return deferer.promise; 
} 

예 :

function getUserDetailsByEmail(email) { 
    var userByEmailRequestPath = '/api/party?email=' + email; 
    return jsonRequest(userByEmailRequestPath, email); 
} 

UserByEmail 엔드 포인트는 응답 JSON의 일환으로 이메일을 반환하지 않습니다와 나는 아직도 반환 값의 이메일을 포함합니다.

+2

간단한 예를 들려 줄 수 있습니까? – thefourtheye

+0

업데이트 됨. 도움이 되나요? 그게 더 복잡한 표현이 될 수 있다고 생각합니다. – sumek

답변

0

귀하의 예를 따르기가 어렵습니다. 그러나 당신이 이해 한 것에 대해 당신은 두 가지 출처로부터 의견을 받고 싶습니다. 외부 매개 변수를받는 다른 함수에서 호출을 래핑 할 수 있습니다. 같은 emailpath 사용할 수 있도록 약속을 반환 만약 내가 제대로 이해하고

Q(initialCall) 
    .then(getJsonRequestExecutor(email)); 
0

, 당신이 원하는 getUserDetailsByEmail() :

function getJsonRequestExecutor(externalObject) { 
    return function(pathThatIsContructedBasedOnPreviousResults) { 
     ... 
    }; 
} 

그런 다음 당신이로 호출 할 수 있습니다 : 당신이 이런 식으로 뭔가를 찾고있는 가정 https 응답으로 반환 된 데이터입니다.

이것은 여러 가지 방법으로 수행 할 수 있습니다. 나는 두 가지를 생각할 수 :

1. "사전 작성"getUserDetailsByEmail()에서 개체, jsonRequest()에서 데이터를 증대하고,이 포장 된 약속은 반환

function jsonRequest(obj) { 
    var dfrd = Q.defer(), 
    var options = _.extend({}, capsuleOptions, { 
     'path': obj.path 
    }); 
    https.get(options, function (response) { 
     response.on('data', function (d) { 
      obj.data = JSON.parse(d); 
      dfrd.resolve(obj); 
     }); 
    }).on('error', function(e) { 
     dfrd.reject(e); 
    }); 
    return dfrd.promise; 
} 

function getUserDetailsByEmail(email) { 
    return jsonRequest({ 
     email: email, 
     path: '/api/party?email=' + email 
    }); 
} 

2. "후 작성 "두 버전 jsonRequest()

function jsonRequest(path) { 
    var dfrd = Q.defer(); 
    var options = _.extend({}, capsuleOptions, { 
     'path': obj.path 
    }); 
    https.get(options, function (response) { 
     response.on('data', function (d) { 
      dfrd.resolve(JSON.parse(d)); 
     }); 
    }).on('error', function(e) { 
     dfrd.reject(e); 
    }); 
    return dfrd.promise; 
} 

function getUserDetailsByEmail(email) { 
    var path = '/api/party?email=' + email; 
    return jsonRequest(path).then(function(data) { 
     return { 
      email: email, 
      path: path, 
      data: data 
     }; 
    }); 
} 

에서 비동기 데이터를 획득 한 후 getUserDetailsByEmail()의 개체 :

  • capsuleOptions의 오염을 방지하기 위해 밑줄이 _.extend() 인 것을 볼 수 있습니다. 이것은 솔루션과 밀접하지 않습니다. 단지 좋은 습관입니다.
  • getUserDetailsByEmail().email, .path.data 속성을 가진 js 일반 객체의 약속을 반환합니다.

어떤 다른 버전을 선택했는지 (완전히 다른 무언가)는 jsonRequest()에 대한 다른 호출에 필요한 동작에 따라 결정될 수 있습니다. 이와 관련하여 버전 2가 더 자연 스럽다는 것을 알게 될 것입니다.