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

如何等待异步操作的循环?

  •  0
  • CobaltGecko  · 技术社区  · 3 年前

    我有一个补丁端点,它需要更新一系列字段,迭代每个字段,并更新正确的值。我想做点什么,一旦所有这些事情都完成了,我就会发送一个响应,但我不知道如何等待一个操作循环。如果这是一个单一的操作,我可以补充一下。然后(),但在这种情况下不起作用。什么是优雅的解决方案?

    代码:

    const updateUser = (req, res) => {
        const db = mongoConnection.getDb();
        for (key in req.body) {
            db.collection('users').updateOne(
                {username: req.query.username},
                {$set: {[key]: req.body[key]}}
            )
        }
        // send response once for loop is done
    }
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Terreras    3 年前

    我认为一个简单的答案是将for循环隐藏在异步函数中,然后在端点中使用它。

    const updateUserField = async () =>
      db.collection("users").updateOne(
        {
          username: req.query.username,
        },
        {
          $set: { [key]: req.body[key] },
        }
      );
    
    
    const updateUserEndpoint = (req, res) => {
       for (let field of req.body) {
          await updateUserField(field);
       }
    
       res.status(200).send('updated');
    }
    

    然后,为了进行测试,可以使用注入函数本身的函数包装端点:

    const updateUserEndpoint = (userUpdateFunc) => userUpdateFunc(req, res);
    

    这种模式被称为依赖注入——在为端点编写单元测试时,只需替换 userUpdateFunc 不管你想用什么样的模拟函数。这样就不需要在测试中修补函数。