【问题标题】:Map and Async problems, values seem to be differing, how do i work with this async problem映射和异步问题,值似乎不同,我该如何处理这个异步问题
【发布时间】:2021-04-06 19:38:45
【问题描述】:

只是试图总结数据库中的值,然后对参数取平均值,但事情不会按预期工作,因为项目 1 和 2 是 100 和 33,对于两个用户来说,它应该是 66.5,但是只有其中一个获得所需的输出,请帮帮我,新手 :(

似乎有时有效,有时无效,但你知道演习,要么全部工作;-;

const sumItUp = async (project, sum) => {
  // console.log(project);
  await Project.findById(project, (err, result) => {
    // console.log(result.completion_percentage);
    sum += result.completion_percentage;
    console.log(result.title + " " + sum);
  });
  return sum;
};
const updateUserCompletion = async (user) => {
  // console.log(user);
  let sum = 0;
  for (var i = 0; i < user.projects.length; i++) {
    sum = await sumItUp(user.projects[i], sum);
    // console.log(user.name + " " + user.project[i].title + " " + sum);
  }
  // console.log(sum);
  user.completion_percentage_of_all_projects = sum / user.projects.length;
  user.save();
};
exports.updateTasks = async (request, res) => {
  let id = request.body.id;
  let project = request.projectObject;
  // console.log(id);
  let planned = 0,
    wip = 0,
    review = 0,
    completed = 0;
  project.tasks.map(async (task) => {
    if (task._id.toString() === id.toString()) {
      task.taskName = request.body.taskName;
      task.taskDescription = request.body.taskDescription;
      task.pessimisticTime = request.body.pessimisticTime;
      task.optimisiticTime = request.body.optimisiticTime;
      task.mostLikelyTime = request.body.mostLikelyTime;
      task.status = request.body.status;
    }
    if (task.status === "PLANNED") planned++;
    else if (task.status === "WIP") wip++;
    else if (task.status === "Review") review++;
    else if (task.status === "COMPLETED") completed++;
    // console.log(task._id.toString(), id.toString());
  });
  let total_task = planned + wip + review + completed;
  let comp_percentage =
    (planned * 0 + wip * 0.33 + review * 0.66 + completed) / total_task;
  // console.log(comp_percentage*100);
  // console.log(request.body);
  project.completion_percentage = comp_percentage * 100;
  console.log("completion percentage:", project.completion_percentage);
  const users = [];
  project.save((err) => {
    if (err) return res.status(400).json({ err: "Task not found" });
  });
  await project.team.forEach((user) => {
    User.findById(user, (err, res) => {
      if (err) {
        res.status(400).json({ err: err });
      } else {
        updateUserCompletion(res);
      }
    });
  });
  // console.log(users);
  // console.log(request.body);
  return res.status(200).json({ project });
};

这是我的代码^

这些是输出: supposed to be the same :(

我的 2 个用户有 2 个项目: user 1 user 2

与他们相关的2个项目: project 1 project 2

【问题讨论】:

标签: javascript node.js mongodb dictionary async-await


【解决方案1】:

我不能保证这是唯一的问题,但有一个问题是:要获得findById 的承诺,您必须使用.exec。使用 Promise 时,不要给它传递回调;相反,使用承诺的履行价值。所以:

const sumItUp = async (project, sum) => {
    // console.log(project);
    const {completion_percentage} = await Project.findById(project).exec();
    sum += completion_percentage;
    console.log(`completion_percentage is ${completion_percentage}, updated sum is ${sum}`);
    return sum;
};

【讨论】:

  • 只是好奇,还有什么可能的问题?
  • @AkshayPrassanna - 我只是说我没有进行彻底的代码审查或类似的事情。 :-)
猜你喜欢
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2018-12-09
相关资源
最近更新 更多