首页 > 解决方案 > 无法访问 for 循环中使用的链式 Promise 内的外部范围变量

问题描述

我需要在async/await里面做for..loop,但那样我不能做并行操作。

因此,我将这些承诺推入一个变量,promises稍后我将promise.all()对其进行处理。

这是我的代码。

const promises = [];
  for (let i = 0; i < todayAssignedJobs.length; i += 1) {
    promises.push(Leaderboard.findOrCreate({...}).then((leaderboard, created) => {
      if (!created) {
        const rating = (todayAssignedJobs[i].rating + leaderboard.rating * leaderboard.jobs_completed) / (leaderboard.jobs_completed + 1);
        const commission = todayAssignedJobs[i].commission + leaderboard.commission;
        const jobsCompleted = leaderboard.jobs_completed + 1;
        Leaderboard.update({
          rating,
          commission,
          jobs_completed: jobsCompleted,
          updated_by: 'system',
        }, {
          where: {
            id: leaderboard.id,
          },
        });
      }
      AssignedJob.update({
        is_leaderboard_generated: true,
      }, {
        where: {
          id: todayAssignedJobs[i].id,
        },
      });
    }));
  }
await Promise.all(promises)

Assigned.update({..}, { where: { id: todayAssignedJobs[i].id }})

不知何故,当我遇到错误时,我无法获得 id :

未处理的拒绝错误:WHERE 参数“id”具有无效的“未定义”值

有人可以解释发生了什么吗?另外,请建议我可以在下面做吗?

promises.push(async () => { // I will use await here })

标签: javascriptnode.jspromiseasync-awaitsequelize.js

解决方案


问题是findOrCreate()返回一个包含两个值的数组,我在这里[ {...}, boolean ]

传递它们总是和一个. 我进行了更改,现在它工作正常。(leaderboard, created)createdundefinedleaderboardarray



const promises = todayAssignedJobs.map((todayAssigned) => Leaderboard.findOrCreate({...}).then(([leaderboard, created]) => {
    if (!created) {
      const rating = (todayAssigned.rating + leaderboard.rating * leaderboard.jobs_completed) / (leaderboard.jobs_completed + 1);
      const commission = todayAssigned.commission + leaderboard.commission;
      const jobsCompleted = leaderboard.jobs_completed + 1;
      Leaderboard.update({
        rating,
        commission,
        jobs_completed: jobsCompleted,
        updated_by: 'system',
      }, {
        where: {
          id: leaderboard.id,
        },
      });
    }
    AssignedJob.update({
      is_leaderboard_generated: true,
    }, {
      where: {
        id: todayAssigned.id,
      },
    });
  }));

await Promise.all(promises);

推荐阅读