[英]Create a new array of documents of objects using map JavaScript
我有一個 id 數組,我試圖通過這個數組 map 創建一個新的電影對象數組,該數組位於我的數據庫中。
我的代碼看起來像這樣......
const movieIds = foundDirector.movies;
const movies = movieIds.map(async (id) => {
await Movie.findById(id);
});
上面的代碼不起作用。 我可以從 map function 中找到一部電影並查看該數據,但是當我將電影打印到控制台時,我得到一個包含空對象的數組。
然后我決定改為這樣做並且它有效。
const movieIds = foundDirector.movies;
let movies = [];
for (let i = 0; i < movieIds.length; i++) {
const movie = await Movie.findById(movieIds[i]);
movies.push(movie);
}
我對解決方案不滿意。 顯然,我在理解 Promise 在 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
仍然只是一個未決的 promise。
誰能解釋一下這里發生了什么,以及如何使用 map function 而不是 for 循環來實現這一點。
好吧,您可以通過以下方法實現您想要的。
const allMovies = await Promise.all(movieIds.map(Movie.findById))
它只是將 id 映射到 Promise 並等待它們。
const allMovies = Promise.all(movies).then((values) => values);
console.log(allMovies);
上面的代碼將記錄等待的承諾,因為到console.log
沒有發生任何事情。 沒有什么可以等待這些承諾的結果。 然后回調對allMovies
變量沒有影響。 這個答案有很好的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.