2016-10-19 2 views
-1

연결 된 약속에서 데이터를 확인하고 다시 전달하는 방법에 문제가 있습니다. 나는 request-promise와 함께 노드 js를 사용하고있다. 여기서 내가 오브젝트의 배열하여 firstFunction, 각 개체에서 얻은 통화를 수행하기위한 루프를루프에서 약속을 해결합니다.

start(name) 
    .then(firstFunction) 
    .then(secondFuntion) 
    .then(function(){ 
     // i want to return data from secondfunction back 
    )) 

문제에서는 secondFunction에 내 코드이다. 나는 각 반복 후에 또는 모든 반복 후에 약속을 해결합니까. 글로벌 객체를 생성하고 그 결과를 저장하고 그 결과를 반환하는 것이 더 똑똑할까요? 다음 secondFunction 내 코드는 내가 그것을 알아 냈이

var secondFunction = function(data){ 
    var promise = new Promise(function(){ 
     for(var i= 0; i <data.length; i ++){ 
      options = { url: "", jason: true} 
      rp.(options) 
       .then(function(resp){ 
       // i do something with respose and need to save this 
       //should i resolve the promise here?? 
       }) 
       .catch(function(err){ 
       }); 
     } 
    }); 
    return promise; 
} 

편집

처럼 보인다! 덕분에 모든 도움을 제 2의 기능에 당신은, 배열의 각 항목에 비동기 작업을 수행하는 일반적인 패턴은, 약속을 반환하는 함수로 작업을하는 것입니다이

var task = function(item){ 
    // performed the task in here 
} 

var actions = data.map(task); 
return Promise.all(actions); 

답변

0

했다 [].map()을 사용하여 값 배열을 Promise 배열로 매핑하십시오. 그런 다음 Promise 배열을 사용하는 Promise.all()을 사용하고 원래 배열의 모든 약속이 해결되면 값 배열로 해결되는 단일 약속을 반환합니다. 그것은 다음과 같습니다

var secondFunction = function(data) { 
    var promisesArray = data.map(rp); 
    return Promise.all(promisesArray); 
} 

세 번째 .then()data 등장 순서대로 data에서 각 항목에 rp을 적용하여 해결 값의 배열을해야합니다.

일부 ES6 설탕을 가진 짧은 버전입니다 :

const secondFunction = data => Promise.all(data.map(rp)); 

서버 측 JS에 대한 사실상의 약속 라이브러리입니다 블루 버드를 사용하는 경우, 당신은 속기를 사용할 수 Promise.map(), 어떤 배열과 매핑 함수를 받아 들여 동일을합니다 :

const secondFunction = data => Promise.map(data, rp); 
+0

고마워요! 나는 너의 제안을 사용했다. – inhaler

관련 문제