функция, возвращающая непосредственно прохождение asyn await и для каждого блока - PullRequest
0 голосов
/ 16 января 2020

для перехода.

У меня есть проблема, которой я хотел бы поделиться и, надеюсь, иметь возможность поделиться с вами своими хитростями и хитростями, в первую очередь вот как выглядит вся моя функция:

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());
}

хорошо, давайте разберемся и позвольте мне кратко объяснить, в чем мои проблемы, намерения и ожидания.

как вы, ребята, можете видеть в этой части:

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());

i ' Я успешно могу получить sh результат поиска модели чата для переменной dataChat, и после этого моя цель состоит в том, чтобы использовать переменную dataChat l oop для каждого из них, чтобы создавать и изменять с использованием условий в моих l oop и pu * 1033. * это приводит к переменным, а затем к возвращаемым, поскольку эта часть показывает

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());

проблема состоит в том, что вместо возврата результирующих переменных, которые уже изменены, возвращается пустой массив и передается значение для каждого l oop, т.е. уже попробуйте поставить await раньше, вот так:

    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));
            });
    }
});

, но это не помогает и продолжает проходить напрямую и возвращает пустой массив с таким результатом

{ "response": 200, "result": [] }* 10 20 *

я уже проверяю результат этого для каждого l oop, используя консольный журнал в моем терминале следующим образом:

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


            })

показывает, что данные элемента были успешно изменены, и результат также уже успешно изменен с данными из элемента, но, к сожалению, он решает пройти процесс и непосредственно вернуть, но еще не изменить переменную результата, в результате чего я получаю пустой массив.

К вашему сведению, я использую mon goose (MongoDB) и продолжаю (Postgres) метод в этой функции

спасибо, что заглянули и хорошего дня:)

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Не смешивайте синтаксис await с then вызовами, а не используйте forEach. Вы ищете

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

  try {
    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(),
    });

    const dataChat = chatModel.find({
      user_id: req.query.user_id,
      platform_id: req.query.platform_id,
      vendor_id: req.query.vendor_id,
    })
    .sort({
      created_At: 'asc'
    })
    .skip(parseInt(pagination.page, 10))
    .limit(parseInt(pagination.row, 10))
    .lean();

    const result = await Promise.all(dataChat.filter(element =>
      element.chat_type === 'negotiation'
    ).map(async (element) => {
      const dataPicture = await dbPlatform.findByPk(element.platform_id, {
        include: [{
          model: dbPlatform_image,
          order: [
            ['created_at', 'asc']
          ],
          limit: 1,
        }],
      });
      element.data = dataPicture;
      console.log(element, '<< ASD COBA CEK');
      return element;
    }));
    setContent(200, result);
    res.status(200).json(getContentSuccess());
  } catch(err) {
    // console.log(err, '<<<< dimana errornya');
    setContent(500, errorCode.generalError.SYSTEM_ERROR);
    res.status(500).json(getContentFail(req, err));
  }
}
0 голосов
/ 16 января 2020

Проблема в вашей forEach части. Обещание или асинхронность / ожидание не работают в forEach. Вам нужно либо использовать Promise.all, если вы можете делать что-то параллельно, либо использовать for..of, если вы хотите делать это последовательно.

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));
      });
  }
}));

Если вы хотите делать вещи последовательно

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");
  }
}

Надеюсь, это поможет

...