簡體   English   中英

使用 map JavaScript 創建一個新的對象文檔數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM