2017-11-28 1 views
1

Ich verwende eine promise, um eine Antwort auf Postman der result array zu erstellen; resolve() wird jedoch aufgerufen, bevor die forEach-Schleife beendet wird, während resolve() außerhalb der forEach-Schleife liegt. Ich denke, das liegt an der Callback-Stack-Funktionalität.nodeJS: Promise ausgeführt vor für Schleife beendet, Callback-Stack

Wie führe ich die resolve() aus, nachdem die forEach-Schleife ausgeführt wurde, unter Berücksichtigung der callback stack?


(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

Sie möchten die Auflösung aufrufen, nachdem alle post() -Aufrufe abgeschlossen wurden? –

+0

Ja, z.B. Nachdem alle Änderungen an result-array vorgenommen wurden, dann resolve() und requestWithJSON aufrufen – computerguy1234

+0

@SLaks Antwort sieht gut aus. –

Antwort

2

Du nennst resolve(), bevor eine der Antworten kommen.

Sie müssen request() in einer Funktion wickeln, die ein Versprechen (einer einzigen Anfrage) zurückgibt, dann schreiben

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

für alle diese Versprechungen zu warten.

0

Sollte näher sein, was Sie brauchen.

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'); 
      }); 
     }); 
});