90777
`express`を使用して`mongoose`で`MONGODB`を使っています  
_下記はフォローしているユーザの投稿と自分の投稿を取得するエンドポイントです_  
SNSでよくあるタイムラインです。

```

    router.get("/timeline/all", async (req, res) => {
      try {
        // 自分が投稿した内容
        const currentUser = await User.findById(req.body.userId);
        const userPosts = await Post.find({ userId: currentUser._id });
    
        // フォローしているユーザーの投稿
        const friendPosts = await Promise.all(
          currentUser.followings.map((friendId) => {
            return Post.find({ userId: friendId });
          })
        );
    
        return res.status(200).json(userPosts.concat(...friendPosts));
      } catch (err) {
        res.status(500).json(err);
      }
    });
    
    
```

_フォローしているユーザの投稿で下記の実装をしています。_

```

    //フォローしているユーザの投稿
    const friendPosts = await Promise.all(
          currentUser.followings.map((friendId) => {
            return Post.find({ userId: friendId });
          })
        );
    
```

_なぜPromise.allが必要なのでしょうか？_

* * *

下記のようにPromise.allがなしでも`friendPosts`はawaitを使っているので取得できていると思うのですが、  
非同期でDBから引っ張ってきたものをmapで回すにはPromise.allの中で行う必要があるのでしょうか？？

```

    // フォローしているユーザーの投稿
        const friendPosts = currentUser.followings.map((friendId) => {
          return Post.find({ userId: friendId });
        });
    
```

`Promise.all`が複数の非同期処理を並列で行うためにあるのは知っているのですが、今回のケースだと、mapを回し終わるまで結果を返さないようにするためでしょうか？
CC BY-SA 4.0
2022-08-26T17:46:29.200
90776
2022-08-27T00:12:47.380
2022-08-26T17:54:26.697
51745
51745
question
javascript promise
なぜPromise.allが必要なのか express x MONGODB環境
`Post.find()` は (`userPosts`取得部分を見ると) Promiseのようです。

`Promise.all()` がない以下の記述だと, 配列要素のどれか(もしくはすべて)が未だ pending状態かもしれません

```

    // フォローしているユーザーの投稿
        const friendPosts = currentUser.followings.map((friendId) => {
          return Post.find({ userId: friendId });
        });
    
```

`await Promise.all()`を指定することで, 配列要素内がすべて解決されるか いずれかが拒否されるまで待ちます
CC BY-SA 4.0
2022-08-27T00:12:47.380
90777
2022-08-27T00:12:47.380
43025
90776
answer