【问题标题】:loop of promises using sequelize使用 sequelize 的承诺循环
【发布时间】:2017-06-30 23:07:57
【问题描述】:

我有一个大型数组,我想循环并执行承诺,但我的循环在承诺结束之前结束。他们是我可以通过循环承诺并能够在承诺循环结束后执行某些操作的一种方式。这是我的代码。

  Meters.getMetersByResidentId(resident.id)
    .then(function(meters){
      _.each(meters, function(meter){
        var meter_obj = {};
        var meter_obj_arr = [];
        Servers.getServerIdByMeterId(meter.id)
        .then(function(server_id){
          Meters.getNameByMeterId(meter.id)
          .then(function(name){
            Dials[server_id[0].server_id].getPreviousTotalByChannelServerAndSN(server_id[0].server_id,name[0].meter_id,billing_id)
            .then(function(previous_total){
              Dials[server_id[0].server_id].getCurrentTotalByChannelServerAndSN(server_id[0].server_id,name[0].meter_id,billing_id)
              .then(function(current_total){
                Promise.all([Billings.getStartDateById(billing_id),Billings.getEndDateById(billing_id)])
                .then(function(result){
                  meter_obj.meter_no = meter.meter_id;
                  if (meter.type == 1)  meter_obj.meter_type = "EL";
                  else if (meter.type == 0) meter_obj.meter_type = "W";
                  meter_obj.days = Math.round(Math.abs((result[0][0].start_date.getTime() - result[1][0].end_date.getTime())/(24*60*60*1000)));
                  meter_obj.prev_read_date = dateFormat(result[0][0].start_date, "mediumDate");
                  meter_obj.current_read_date = dateFormat(result[1][0].end_date,"mediumDate");
                  meter_obj.code = "MR";
                  meter_obj.current_reading = current_total[0].total;
                  meter_obj.prev_reading = previous_total[0].total;
                  meter_obj.multiplier = meter.multiplier;
                  meter_obj.usage = Math.round((meter_obj.current_reading - meter_obj.prev_reading)*meter_obj.multiplier*100)/100;
                  if (meter.type == 1)  meter_obj.units = "KWh";
                  else if (meter.type ==0)   meter_obj.units = "m3"
                  meter_obj_arr.push(meter_obj);
                  invoice_obj.meters = meter_obj_arr;
                });
              });
            });
          });
        });
      });
    });

一旦所有仪表数据都被推入数组,我想显示invoice_obj

【问题讨论】:

    标签: promise sequelize.js


    【解决方案1】:

    Meters.getMetersByResidentId(resident.id)
      .then(function (meters) {
        var metersLoop = []
        
         _.each(meters, function (meter) {
          metersLoop.push(function () {
            return Servers.getServerIdByMeterId(meter.id)
              .then(function (server_id) {
                return Meters.getNameByMeterId(meter.id)
                  .then(function (name) {
                    return Dials[server_id[0].server_id].getPreviousTotalByChannelServerAndSN(server_id[0].server_id, name[0].meter_id, billing_id)
                      .then(function (previous_total) {
                        return Dials[server_id[0].server_id].getCurrentTotalByChannelServerAndSN(server_id[0].server_id, name[0].meter_id, billing_id)
                          .then(function (current_total) {
                            return Promise.all([Billings.getStartDateById(billing_id), Billings.getEndDateById(billing_id)])
                              .then(function (result) {
                                var meter_obj = {
                                  meter_no: meter.meter_id,
                                  days: Math.round(Math.abs((result[0][0].start_date.getTime() - result[1][0].end_date.getTime()) / (24 * 60 * 60 * 1000))),
                                  prev_read_date: dateFormat(result[0][0].start_date, "mediumDate"),
                                  current_read_date: dateFormat(result[1][0].end_date, "mediumDate"),
                                  code: "MR",
                                  current_reading: current_total[0].total,
                                  prev_reading: previous_total[0].total,
                                  multiplier: meter.multiplier,
                                  usage: Math.round((meter_obj.current_reading - meter_obj.prev_reading) * meter_obj.multiplier * 100) / 100
                                }
    
                                if (meter.type == 1) meter_obj.meter_type = "EL";
                                else if (meter.type == 0) meter_obj.meter_type = "W";
    
                                if (meter.type == 1) meter_obj.units = "KWh";
                                else if (meter.type == 0) meter_obj.units = "m3"
    
                                return meter_obj
                              })
                          })
                      })
                  })
              })
          })
        })
    
        return Promise.all(metersLoop)
      }).then(function (meter_obj_arr) {
        console.log(meter_obj_arr)
      })
    })

    【讨论】:

    • 当我这样做时,meter_obj_arr 返回一个函数而不是数组!.!.!
    • 摆脱匿名函数解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2018-03-25
    • 1970-01-01
    • 2020-09-04
    • 2015-06-05
    • 2018-09-21
    相关资源
    最近更新 更多