使用Promise.all删除所有ID

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Promise.all删除所有ID相关的知识,希望对你有一定的参考价值。

首先,道歉,因为我无法为这个问题找到更好的标题。我将尝试解释我的问题,如果您不明白发生了什么,请告诉我。

[删除电影时,我还想从其流派数组中删除电影的ID。每个流派都有一个包含该流派中所有电影ID的电影数组,每个电影都有一个包含该电影的所有流派ID的流派数组。

async delete(req, res, next) 
    try 
      const movie = await Movie.findOne( _id: req.params.id );
      if (!movie) return res.status(400).send( error: "Movie not found" );

    // Here I find all the genres. I get an array with all the genres objects
    // [genre1, genre2] inside the genre object there is an array with all the movie ids that belongs to that genre
      let _genres = await Genre.find( _id:  $in: movie.genre  );

    // Now I am trying to return all the genre that are different from the movie._id I am deleting 
      _genres = await Promise.all(_genres.map(async (genre) => 
        genre.movies.filter(item => item !== movie._id);
        await genre.save();
        return genre;
      ));

      await movie.remove();
      return res.send( deleted: true );
     catch (e) 
      next(e);
    

我没有收到任何错误,但是它没有从流派中删除电影ID。谢谢。

答案

感谢Bergi,我得以弄清楚。过滤器不会更改您的对象,因此我不得不重新分配它,还必须将id转换为字符串以确保可以进行比较。谢谢贝尔吉。

有效的代码,如果您认为我可以编写一种更好的方法,请告诉我。

  async delete(req, res, next) 
    try 
      const movie = await Movie.findOne( _id: req.params.id );
      if (!movie) return res.status(400).send( error: "Movie not found" );


      movie.genre.forEach(async (id) => 
        const genre = await Genre.findById(id);
        if (genre) 
          genre.movies = genre.movies.filter(item => item.toString() !== movie._id.toString());
          await genre.save();
        
      );

      await movie.remove();
      return res.send( deleted: true );
     catch (e) 
      next(e);
    
  

以上是关于使用Promise.all删除所有ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nuxt 的 asyncData 中对 Promise.all 进行数组解构

如何在 useEffect 挂钩中使用 Promise.all 获取所有数据?

vue promise.all使用

Promise.all()使用方法

如何使用Promise.All()执行异步诺言?

Promise.all() 允许失败的替代方案? [复制]