在nodejs中使用Q.js进行循环的正确方法

时间:2016-03-11 02:37:01

标签: javascript node.js promise q

我希望有人可以帮助我更好地理解承诺。 我和他们很新秀。 我正在使用promises进行数据库查询,当结果正确时获取数据数组。然后我需要做一个循环迭代这个数组并执行每个元素删除操作,然后删除操作到另一个发送操作,当两个操作完成时,然后,为数组的每个元素重复该过程,但必须完成每个元素在完成另一个数组元素之前完成操作和发送操作...我的代码没有发生,循环对每个元素进行删除操作而不等待删除和发送操作返回结果....  操作删除和运输都具有结构

function x (makeQuery){
  .......
  var deferred = Q.defer();
   .....
   function(err, result) {
                    if (err) {
                      deferred.reject(err);
                    } else {
                     deferred.resolve(result);
                    }

                });
  return deferred.promise;
}

我的代码是:

 getElementInPostgres(makeQuery)
        .then(function (obj) {
          if (...){
                results= obj['rows']
                index =0
                for (var i = 0; i < results.length; i++) {
                    var notification = {}
                  notification.tag='SubscriptionNode'
                  notification.indexSocket=results[i]['indexsocket']
                  notification.clientID=results[i]['clientid']
                  notification.callbackURL=results[i]['callbackurl']
                  notification.deploymentID=results[i]['deploymentid']
                  notification.clusterID=results[i]['clusterid']
                  notification.date=results[i]['registered']
                  var query = "DELETE FROM.....";
                  var params = [notification.indexSocket];
                  deleteInPostgres(query,params,notification)
                  .then(function (notification) {
                      if(notification.clientID){
                          sendInfoToPython(notification)
                           .then(function (obj) {
                               ..........
                           }).fail(function (err) {
                              ......
                           });
                      }

                  }).fail(function (err) {
                    ......
                   });
                 }
               }
               else{
                .........
               }
              }).fail(function (err) {

                });

1 个答案:

答案 0 :(得分:1)

您可以继续使用Q但是为了迭代第一个结果,您可以使用async.each(https://github.com/caolan/async#each)。在iteratee中,您可以执行删除任务。在迭代的回调中恢复你的发送操作。它将使您的代码更简单,更简洁