代码之家  ›  专栏  ›  技术社区  ›  Sameer

如何使异步代码在async.parallel方法内同步-NodeJs

  •  0
  • Sameer  · 技术社区  · 8 年前

    我的后端代码如下:

    exports.getDashboard = (req, res) => {
      const dashboard = {};
      const query = {};
      let start;
      let end;
      async.parallel([
        (callback) => {
          const { role } = req.user;
          switch (role) {
            case 'Admin':
              console.log('case admin is working >> >> >> >> >> >> >> >> >> >> ');
              start = moment().startOf('day'); // set to 12:00 am today
              end = moment().endOf('day'); // set to 23:59 pm today
              query.where = {
                entryTime: {
                  $gt: start,
                  $lt: end,
                },
              };
              break;
            case 'Manager':
              console.log('case manager is working >> >> >> >> >> >>> >> >> >> >> >> >> >>');
              Staff.findOne({
                where: {
                  loginId: req.user.id,
                },
              }).then((staffData) => {
                console.log('staffData', JSON.stringify(staffData));
                query.where = {
                  entryTime: {
                    $gt: start,
                    $lt: end,
                  },
                  branchId: staffData.branchId,
                };
              });
              break;
            default:
              console.log('default case');
          }
    
          console.log('query >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>', query);
          // query is undefined if my case is manager async call.
    
          Visitor.findAndCountAll(query)
            .then((data) => {
              dashboard.todayentries = data;
              callback();
            });
        },
      ], (err) => {
        if (err) return res.status(500).send(err);
        return res.status(200).send(dashboard);
      });
    };
    

    如果我的案子是 查询未定义。

    注意:我不想删除我的async.parallel方法。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Sameer    8 年前

    我尝试了另一个回拨,工作很好。

    我试过的是:

    exports.getDashboard = (req, res) => {
      const dashboard = {};
      const query = {};
      let start;
      let end;
      async.parallel([
        (callback) => {
    
         const cb = () => {
          Visitor.findAndCountAll(query)
            .then((data) => {
              dashboard.todayentries = data;
              callback();
            });
          }
    
    
          const { role } = req.user;
          switch (role) {
            case 'Admin':
              start = moment().startOf('day'); // set to 12:00 am today
              end = moment().endOf('day'); // set to 23:59 pm today
              query.where = {
                entryTime: {
                  $gt: start,
                  $lt: end,
                },
              };
              cb();
              break;
            case 'Manager':
              Staff.findOne({
                where: {
                  loginId: req.user.id,
                },
              }).then((staffData) => {
                console.log('staffData', JSON.stringify(staffData));
                query.where = {
                  entryTime: {
                    $gt: start,
                    $lt: end,
                  },
                  branchId: staffData.branchId,
                };
                cb(); // my custom callback
              });
              break;
            default:
              console.log('default case');
          }
        },
      ], (err) => {
        if (err) return res.status(500).send(err);
        return res.status(200).send(dashboard);
      });
    };
    

    这种方法好用吗?