2017-11-28 4 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()コールが完了した後で解決を呼びたいと思いますか? –

+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'); 
      }); 
     }); 
}); 
関連する問題