我有一个数组的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循环来实现。
好了,你可以实现你想要的,像下面的方法。
const allMovies = await Promise.all(movieIds.map(Movie.findById))
它只是将id映射到承诺,并等待所有的承诺。
const allMovies = Promise.all(movies).then((values) => values);
console.log(allMovies);
上面的代码会记录下等待的承诺,因为到时 console.log
什么都还没有发生。没有任何东西在等待这些承诺的结果。那么回调对 allMovies
变量。这个 回答 有不错的信息。