2017-11-28 1 views
1

promise을 사용하여 result array의 우편함에 대한 응답을 생성합니다. 그러나 resolve()은 forEach 루프가 끝나기 전에 호출되고 resolve()은 forEach 루프 외부에 호출됩니다. 콜백 스택 기능 때문이라고 생각합니다.nodeJS : for 루프가 완료되기 전에 실행 약속, 콜백 스택

callback stack을 고려하여 forEach 루프가 실행 완료된 후에 resolve()을 어떻게 실행합니까?


(server.js) : 응답 중 하나가 도착하기 전에

logServer.post('/log/asset/audit/', function(req,res){ 
    console.log('--- starting log/asset/audit'); 

    logDB.collection('logs') 
    .find({"transaction.assetName" : assetName, "transaction.assetOwner" : assetOwner}) 
    .toArray((err, result) => { 
     let token = JSON.parse(JSON.stringify(self_jwt_body)); 

     var JSONPromise = new Promise((resolve, reject) => { //initialization  

     result.forEach(function(element, index, array) { 
     console.log('- before request.post'); 

      request.post({ 
       url: `${dc_link}/audit`, //includes dc_IP, dc_port and /audit 
       headers: {  
       "jwt": jwt.sign(token, jwtSecret) 
       } 
      }, function(error,response,body) { 
       console.log('path 0'); 
       let parseBody = JSON.parse(body); 

       console.log('path 3'); 
       result[0].transaction.signature = parseBody.additionalData; 
       console.log('result: ', result); 
       //**HERE 
      }); 
     }); 
     //**HERE 
     resolve(); 

     }; //end callback 

     JSONPromise.then(() => { //finalization //**HERE 
     respondWithJSON(200, req.body.result, req.body.description, res, result); 
     console.log('end log/asset/audit'); 
     }; 
    }); 
}); 
+0

모든 post() 호출이 완료된 후에 resolve를 호출하고 싶습니다. –

+0

예, 예 : result-array에 대한 모든 수정이 끝나면 resolve()를 호출하고 respondWithJSON을 호출합니다. – computerguy1234

+0

@SLaks 응답이 좋습니다. –

답변

2

당신은 resolve()를 호출하고 있습니다.

당신은 다음

Promise.all(result.map(e => requestPromise(...))) 

그 약속의 모든 기다릴 쓰기 (단일 요청의) 약속을 반환하는 함수에 request()을 포장해야합니다.

0

가까운 곳에 있어야합니다.

logServer.post('/log/asset/audit/', function (req, res) { 
    console.log('--- starting log/asset/audit'); 

    logDB.collection('logs') 
     .find({ "transaction.assetName": assetName, "transaction.assetOwner": assetOwner }) 
     .toArray((err, result) => { 
      let token = JSON.parse(JSON.stringify(self_jwt_body)); 

      var JSONPromise = new Promise((resolve, reject) => { //initialization  

       let async_result = result.map(function (element, index, array) { 
        console.log('- before request.post'); 

        return new Promise((resolve,reject)=>{ 
         request.post({ 
          url: `${dc_link}/audit`, //includes dc_IP, dc_port and /audit 
          headers: { 
           "jwt": jwt.sign(token, jwtSecret) 
          } 
         }, function (error, response, body) { 
          console.log('path 0'); 
          let parseBody = JSON.parse(body); 

          console.log('path 3'); 
          result[0].transaction.signature = parseBody.additionalData; 
          console.log('result: ', result); 
          resolve(); 
          //**HERE 
         }); 
        }); 
       }); 
       //**HERE 

       return Promise.all(async_result); 


      }); //end callback 

      JSONPromise.then(() => { //finalization //**HERE 
       respondWithJSON(200, req.body.result, req.body.description, res, result); 
       console.log('end log/asset/audit'); 
      }); 
     }); 
}); 
관련 문제