【问题标题】:How to make async code into sync inside the async.parallel method - NodeJs如何在 async.parallel 方法中使异步代码同步 - NodeJs
【发布时间】:2018-09-30 07:55:15
【问题描述】:

我的后端代码如下:

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

如果我的情况是 Manager 查询变得未定义。

我已经问了一个异步调用的问题,他们建议使用回调,没关系,但是如何在 async.parallel 方法中使用嵌套回调?

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

【问题讨论】:

  • 问题为什么有promise标签?如果你使用它们,情况会完全不同,而且可能更合理。
  • How to make async code into sync 这是不可能的 - 你只需要想想为什么代码是 asynchronous 就可以理解为什么它不能被生成 synchronous - 提示:javascript 无法预测未来
  • 查看async lib 的最新版本,看起来您可以在回调中返回承诺,所以不要忘记返回承诺.. 例如。 return Staff.findOne({ 也是你的 Visitor.findAndCountAll( 只是想放置在 async.parallel 的回调中,如果你希望在所有其他承诺完成后执行。

标签: javascript node.js callback async.js


【解决方案1】:

我尝试了另一个回调,工作正常。

这是我尝试过的:

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

这个方法好用吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多