Untuk mampir.

Saya punya masalah yang ingin saya bagikan dan semoga dapat berbagi tentang kesulitan dan trik dengan Anda, pertama dan terutama inilah tampilan keseluruhan fungsi saya:

async function get(req, res) {
  const pagination = simplePagination(req);

  let result = [];
  let dataChat = [];
  await chatModel.updateMany({
      user_id: req.query.user_id,
      platform_id: req.query.platform_id,
      vendor_id: req.query.vendor_id,
    }, {
      read: 1,
      updated_At: new Date(),
    })
    .then(() => chatModel.find({
        user_id: req.query.user_id,
        platform_id: req.query.platform_id,
        vendor_id: req.query.vendor_id,
      })
      .sort({
        created_At: 'asc'
      })
      // eslint-disable-next-line radix
      .skip(parseInt(pagination.page))
      .limit(parseInt(pagination.row))
      .lean()
      .then(async(data) => {
        dataChat = data;
      })
      .catch((err) => {
        // console.log(err, '<<<< dimana errornya');
        setContent(500, errorCode.generalError.SYSTEM_ERROR);
        return res.status(500).json(getContentFail(req, err));
      }));

  dataChat.forEach((element) => {
    if (element.chat_type === 'negotiation') {
      dbPlatform.findByPk(element.platform_id, {
          include: [{
            model: dbPlatform_image,
            order: [
              ['created_at', 'asc']
            ],
            limit: 1,
          }],
        })
        // eslint-disable-next-line no-loop-func
        .then((dataPicture) => {
          element.data = dataPicture;
          result.push(element);
          console.log(element, '<< ASD COBA CEK');
        })
        .catch((err) => {
          setContent(500, errorCode.generalError.SYSTEM_ERROR);
          return res.status(500).json(getContentFail(req, err));
        });
    }
  });

  setContent(200, result);
  await res.status(200).json(getContentSuccess());
}

Ok mari kita urai dan saya jelaskan secara singkat apa masalah, niat dan harapan saya.

Seperti yang kalian lihat di bagian ini:

let result = [];
let dataChat = [];

await dataChat.forEach((element) => {
    if (element.chat_type === 'negotiation') {
        dbPlatform.findByPk(element.platform_id,
            {
                include: [{
                    model: dbPlatform_image,
                    order: [['created_at', 'asc']],
                    limit: 1,
                }],
            })
            // eslint-disable-next-line no-loop-func
            .then((dataPicture) => {
                element.data = dataPicture;
                result.push(element);
                console.log(element, '<<<< check element');
                console.log(result, '<<<<<< resultnya');
            })
            .catch((err) => {
                setContent(500, errorCode.generalError.SYSTEM_ERROR);
                return res.status(500).json(getContentFail(req, err));
            });
    }
});

setContent(200, result);
await res.status(200).json(getContentSuccess());

Saya berhasil dapat mendorong hasil dari model obrolan find ke variabel dataChat dan setelah itu tujuan saya adalah untuk mengulang variabel dataChat menggunakan untuk masing-masing, untuk membuat dan memodifikasi menggunakan kondisi di loop saya dan mendorongnya ke variabel hasil dan kemudian dikembalikan sebagai bagian ini menunjukkan

dataChat.forEach((element) => {
    if (element.chat_type === 'negotiation') {
        dbPlatform.findByPk(element.platform_id,
            {
                include: [{
                    model: dbPlatform_image,
                    order: [['created_at', 'asc']],
                    limit: 1,
                }],
            })
            // eslint-disable-next-line no-loop-func
            .then((dataPicture) => {
                element.data = dataPicture;
                result.push(element);
                console.log(element, '<< ASD COBA CEK');
            })
            .catch((err) => {
                setContent(500, errorCode.generalError.SYSTEM_ERROR);
                return res.status(500).json(getContentFail(req, err));
            });
    }
});

setContent(200, result);
await res.status(200).json(getContentSuccess());

Masalahnya adalah alih-alih mengembalikan variabel hasil yang sudah dimodifikasi, itu mengembalikan array kosong dan meneruskan untuk setiap loop, saya sudah mencoba untuk menunggu sebelum seperti ini:

    await dataChat.forEach((element) => {
    if (element.chat_type === 'negotiation') {
        dbPlatform.findByPk(element.platform_id,
            {
                include: [{
                    model: dbPlatform_image,
                    order: [['created_at', 'asc']],
                    limit: 1,
                }],
            })
            // eslint-disable-next-line no-loop-func
            .then((dataPicture) => {
                element.data = dataPicture;
                result.push(element);
                console.log(element, '<< check element');
            })
            .catch((err) => {
                setContent(500, errorCode.generalError.SYSTEM_ERROR);
                return res.status(500).json(getContentFail(req, err));
            });
    }
});

Tetapi itu tidak membantu dan terus melewati secara langsung dan mengembalikan array kosong dengan hasil seperti ini

{ "response": 200, "result": [] }

Saya sudah memeriksa hasil dari ini untuk setiap loop menggunakan log konsol di terminal saya seperti ini:

            .then((dataPicture) => {
                element.data = dataPicture;
                result.push(element);
                console.log(element, '<<<< check element')
                console.log(result, '<<<< check result')


            })

Itu menunjukkan bahwa data elemen telah berhasil dimodifikasi dan hasilnya juga sudah berhasil dimodifikasi dengan data dari elemen tetapi sayangnya memutuskan untuk melewati proses dan langsung kembali belum mengubah variabel hasil sehingga saya mendapatkan array kosong.

FYI saya menggunakan metode luwak (MongoDB) dan sekuel (Postgres) dalam fungsi ini

Terima kasih sudah mampir dan selamat siang :)

0
Muhamad Fadhil Surya Putra 16 Januari 2020, 21:35

2 jawaban

Jawaban Terbaik

Masalahnya adalah bagian forEach Anda. Janji atau async/tunggu tidak berfungsi di forEach. Anda perlu menggunakan Promise.all jika Anda dapat melakukan sesuatu secara paralel atau menggunakan for..of jika Anda ingin melakukannya secara berurutan.

await Promise.all(dataChat.map(element => {
  if (element.chat_type === "negotiation") {
    return dbPlatform.findByPk(element.platform_id, {
      "include": [{
        "model": dbPlatform_image,
        "order": [
          ["created_at", "asc"]
        ],
        "limit": 1
      }]
    })
      // eslint-disable-next-line no-loop-func
      .then(dataPicture => {
        element.data = dataPicture;
        result.push(element);
        console.log(element, "<< ASD COBA CEK");
      })
      .catch(err => {
        setContent(500, errorCode.generalError.SYSTEM_ERROR);
        return res.status(500).json(getContentFail(req, err));
      });
  }
}));

Jika Anda ingin melakukan sesuatu secara berurutan

for (const element of dataChat) {
  if (element.chat_type === "negotiation") {
    const dataPicture = await dbPlatform.findByPk(element.platform_id, {
      "include": [{
        "model": dbPlatform_image,
        "order": [
          ["created_at", "asc"]
        ],
        "limit": 1
      }]
    });
    element.data = dataPicture;
    result.push(element);
    console.log(element, "<< ASD COBA CEK");
  }
}

Semoga ini membantu

0
Ashish Modi 16 Januari 2020, 20:17