【问题标题】:nodeJS: Promise executing before for loop finishes, callback stacknodeJS:在for循环完成之前执行承诺,回调堆栈
【发布时间】:2018-05-12 04:35:16
【问题描述】:

我正在使用promise 创建对result array 的邮递员的回复;但是,resolve() 在 forEach 循环完成之前被调用,而resolve() 在 forEach 循环之外。我觉得这是由于回调堆栈功能。

考虑到callback stack,我如何在forEach 循环执行完毕后执行resolve()


(服务器.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');
        };
   });
});

【问题讨论】:

  • 您想在所有 post() 调用完成后调用 resolve?
  • 是的,例如在对结果数组进行所有修改之后,然后 resolve() 并调用 respondWithJSON
  • @SLaks 的响应看起来不错。

标签: javascript node.js promise


【解决方案1】:

您在收到任何回复之前致电resolve()

您需要将request() 包装在一个返回承诺(单个请求)的函数中,然后编写

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

等待所有这些承诺。

【讨论】:

    【解决方案2】:

    应该更接近你的需要。

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

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多