Как выполнить код в определенной последовательности в nodeJS? - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть эта проблема в nodeJS, где код ниже вызова 4 асин c функций выполняется до того, как функции возвращают какие-либо данные. Код ниже должен возвращать статус каждого звонка в json. Как я могу выполнить каждую функцию в последовательности? Поэтому, когда я возвращаю данные вызывающей стороне с обновленным статусом или ошибкой, которая произошла в каждой функции?

Это то, что у меня сейчас ...

let idItem = "";
    let statusInsert = "N/A";
    let statusSms = "N/A";
    let statusEmail = "N/A";
    let msgErro = "N/A";


    try {

        let retorno = inserirEmergencia(req).then(
        iar => {
            console.log(iar);
            idItem = iar.data.ID;
            statusInsert = "OK";
        }
        );  

      } catch (e) {
        //Error handling
        idItem = "0";
        statusInsert = "Erro";
        msgErro += " > " + e.message;
      }

      let jsonResposta = 
      {
          "idItem" : idItem,
          "statusInsert" : statusInsert,
          "statusSms" : statusSms,
          "statusEmail" : statusEmail,
          "msgErro" : msgErro
      }

      res.json(jsonResposta);

так, у jsonResposta есть начальный значения, как я могу выполнить четыре функции, как это и быть уверенным, что в конце значение фактическая функция возвращает?

Ответы [ 3 ]

3 голосов
/ 21 февраля 2020

Как вы, наверное, знаете, все работает асинхронно в node.js. Поэтому, когда вам нужно заставить вещи работать в определенном порядке, вам нужно использовать управляющую библиотеку или в основном реализовать ее самостоятельно.

Я предлагаю вам взглянуть на следующие концепции:

1) Функции обратного вызова.

2) asyn c и await

С их помощью вы можете контролировать поток выполнения.

1 голос
/ 22 февраля 2020

Вы не можете попытаться / поймать исключение из Обещания, если не поместите его в функцию async и await.

Вот как вы строите этот поток, используя результат Обещания:

let idItem = "";
    let statusInsert = "N/A";
    let statusSms = "N/A";
    let statusEmail = "N/A";
    let msgErro = "N/A";

    inserirEmergencia(req)
    .then(iar => {
       idItem = iar.data.ID;
       statusInsert = "OK";
     })
     .catch(e => {
        idItem = "0";
        statusInsert = "Erro";
        msgErro += " > " + e.message;
     })
     .then(() => res.json({
          "idItem" : idItem,
          "statusInsert" : statusInsert,
          "statusSms" : statusSms,
          "statusEmail" : statusEmail,
          "msgErro" : msgErro
      }))

Вот другой способ, с другим подходом к данным. Вы «трансформируете объект данных по умолчанию на основе ответа, а затем передаете его в res.json вызов», так что вы можете сделать это:

const defaults = {
  idItem: "0",
  statusInsert: "N/A",
  statusSms: "N/A",
  statusEmail: "N/A",
  msgErro: "N/A"
}

inserirEmergencia(req)
    .then(iar => ({
       ...defaults,
       idItem: iar.data.ID,
       statusInsert: "OK"
     })
     .catch(e => ({
        ...defaults,
        statusInsert: "Error",
        msgErro: ` > ${e.message}`
     })
     .then(res.json)

Вот как вы это делаете с async/await:

post('/emergencia', async (req, res) => {
   const defaults = {
     idItem: "0",
     statusInsert: "N/A",
     statusSms: "N/A",
     statusEmail: "N/A",
     msgErro: "N/A"
   }
   try {
      const iar = await inserirEmergencia(req)
      return res.json({
         ...defaults,
          idItem: iar.data.ID,
          statusInsert: "OK"
      })
   } catch (e) {
      return res.json({
         ...defaults,
         statusInsert: "Error",
         msgErro: ` > ${e.message}`
      })
   }
}

Вы можете сжать это далее, вставив вызов в inserirEmergencia:

post('/emergencia', async (req, res) => {
   const defaults = {
     idItem: "0",
     statusInsert: "N/A",
     statusSms: "N/A",
     statusEmail: "N/A",
     msgErro: "N/A"
   }
   try {
      return res.json({
         ...defaults,
          idItem: (await inserirEmergencia(req)).data.ID,
          statusInsert: "OK"
      })
   } catch (e) {
      return res.json({
         ...defaults,
         statusInsert: "Error",
         msgErro: ` > ${e.message}`
      })
   }
}

Последний скрывает боковой ввод, который не помогает сопровождающим - включая вас в будущем. Это не так уж плохо, но вы смешиваете преобразование данных с вызовом API, поэтому я бы не стал этого делать. Просто включите его, чтобы у вас было больше информации о том, что возможно, когда вы изучаете asyn c в JS.

0 голосов
/ 21 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...