2017-10-16 1 views
0

3 가지 다른 약속의 데이터를 nodejs의 렌더링 함수에 전달하여 pug와 함께 사용하고 싶습니다.다중 약속을 노드 JS로 전달

var promise = require('promise'); 
 

 
var statusChart = new promise(function (resolve, reject) { 
 
      a.aggregate(
 
      [ 
 
       { 
 
        $group: { 
 
         _id: '$status', 
 
         count: {$sum: 1} 
 
        } 
 
       } 
 
      ], function (err, status) { 
 
       if (err) { 
 
        console.log(err); 
 
        reject(err); 
 
       } else { 
 
        resolve(status); 
 
       } 
 
      }); 
 
     }); 
 

 
     var severityChart = new promise(function (resolve, reject) { 
 
      a.aggregate(
 
      [ 
 
       { 
 
        $group: { 
 
         _id: '$severity', 
 
         count: {$sum: 1} 
 
        } 
 
       } 
 
      ], function (err, vuln) { 
 

 
       if (err) { 
 
        console.log(err); 
 
        reject(err); 
 
       } else { 
 
        resolve(vuln); 
 
       } 
 
      }); 
 
     }) 
 

 
     var countChart = new promise(function (resolve, reject) { 
 
      a.count(function (err, count) { 
 
       if (err) { 
 
        console.log(err); 
 
        reject(err); 
 
       } else { 
 
        resolve(count); 
 
       } 
 
      }); 
 
     }) 
 

 
     statusChart.then((message) => { 
 
      console.log(message); 
 
     }); 
 

 
     severityChart.then((data) => { 
 
      console.log(data); 
 
     }); 
 

 
     countChart.then((item) => { 
 
      console.log(item); 
 
     });

위의 코드는 잘 작동하고 내 결과

[ { _id: 'Medium', count: 6 }, 
 
    { _id: 'High', count: 15 }, 
 
    { _id: 'Low', count: 1 } ] 
 
[ { _id: 'New', count: 1 }, 
 
    { _id: 'Closed', count: 1 }, 
 
    { _id: 'In Progress', count: 11 }, 
 
    { _id: 'Pending', count: 9 } ] 
 
22

질문

반환합니다 내가 렌더링 기능이 데이터를 전달 할 방법을.

res.render ('그래프', {info : statusChart, vuln : severityChart, count : countChart}));

나는이 방법을 시도 할 때 내가 얻을 퍼그 측

var에 결과 = { "_77"에 다음과 같은 결과 : 1, "_ 83": 0, "_ 18"널 (null), "_ 38": { "onRejected": null, "promise": { "_ 75": 0, "_ 83": 0, "_18": null, "_ 38": null}}}; var status = { "_75": 1, "_ 83": 0, "_18": null, "_ 38": { "onRejected": null, "promise": { "_ 75": 0, "_ 83": 0 , "_ 18": null, "_ 38": null}}}; var total = { "_75": 1, "_ 83": 0, "_18": null, "_ 38": { "onRejected": null, "promise": { "_ 75": 0, "_ 83": 0 , "_ 18": null, "_ 38": null}}};

+0

사용'Promise.all'를 수행 할. – Bergi

+0

당신은 정말해야 id를 취하는 헬퍼 함수를 ​​작성해,'new Promise' 및'a.aggrate'를 호출 해, 결과에 대한 약속을 돌려줍니다 – Bergi

답변

0

info, vuln 및 count 변수에 약속을 전달합니다. 그것들은 그 시점에서 해결되지 않습니다. 이 작업을 진행하려면 다음

.... 
return Promise.all([statusChart, severityChart, countChart]) 
     .then(([statusChartVal,severityChartVal,countChartVal]) => { 
     return res.render('graphs', {info: statusChartVal, vuln: 
       severityChartVal, count: countChartVal}); 
     }); 
.... 
+0

Promise.all는 모든 약속만을 해결할 때 해결됩니다. 그래서 catch 블록을 추가하십시오. –

0

새로운 약속 ((해결, 거부) =이> { // 뭔가 //

 return new Promise((resolve, reject) => { 
          //Do Something // 
         Resolve(true); 
         }); 
       Promise.all(Promise).then((responses) => { 
         resolve({ 
          status: true, 
          data: data 
         }); 
       });      
    }).then((response) => { 
     res.json(response); 
    });