使用map JavaScript创建一个新的对象文档数组。

问题描述 投票:0回答:1

我有一个数组的ID,我试图通过这个数组映射创建一个新的数组的电影对象,这是在我的数据库。

我的代码看起来像这样...

const movieIds = foundDirector.movies;

const movies = movieIds.map(async (id) => {
    await Movie.findById(id);
  });

上面的代码不工作。我能够找到一个电影,并看到该数据从地图函数内,但当我打印电影到控制台,我得到一个数组与空对象。

然后我决定这样做,而不是它的工作。

const movieIds = foundDirector.movies;
let movies = [];

for (let i = 0; i < movieIds.length; i++) {
  const movie = await Movie.findById(movieIds[i]);
  movies.push(movie);
}

我对这个解决方案不满意。很明显,我在理解JavaScript中的承诺如何工作和使用 async/await 现在已经很简单了,但我不想依赖它。

举个例子,我试着做了这样的事情... ...

const movieIds = foundDirector.movies;
let movies = [];

for (let i = 0; i < movieIds.length; i++) {
  const movie = Movie.findById(movieIds[i]).then((data) => data);
  movies.push(movie);
}

const allMovies = Promise.all(movies).then((values) => values);

我注意到在打印电影到控制台后,我得到了一个待定的承诺数组,我试着使用了 const allMovies = Promise.all(movies).then((values) => values); 不过 allMovies 仍然只是是一个待定的承诺。

有谁能解释一下这是怎么回事,我怎么能用map函数而不是for循环来实现。

javascript promise async-await
1个回答
1
投票

好了,你可以实现你想要的,像下面的方法。

const allMovies = await Promise.all(movieIds.map(Movie.findById))

它只是将id映射到承诺,并等待所有的承诺。

const allMovies = Promise.all(movies).then((values) => values);
console.log(allMovies);

上面的代码会记录下等待的承诺,因为到时 console.log 什么都还没有发生。没有任何东西在等待这些承诺的结果。那么回调对 allMovies 变量。这个 回答 有不错的信息。

© www.soinside.com 2019 - 2024. All rights reserved.