Ich habe dieses Problem in NodeJS, wo der Code unter dem Aufruf von 4 asynchronen Funktionen ausgeführt wird, bevor die Funktionen Daten zurückgeben. Der folgende Code sollte den Status jedes Anrufs in json zurückgeben. Wie kann ich jede Funktion nacheinander ausführen? Wenn ich also die Daten mit dem aktualisierten Status oder Fehler, der in jeder Funktion aufgetreten ist, an den Aufrufer zurücksende?

Das habe ich jetzt ..

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

Also, jsonResposta hat die Anfangswerte. Wie kann ich vier solche Funktionen ausführen und sicherstellen, dass am Ende der Wert die tatsächliche Funktion zurückgibt?

0
André Matos 21 Feb. 2020 im 20:22

3 Antworten

Beste Antwort

Sie können eine Ausnahme von einem Versprechen nur versuchen / abfangen, wenn Sie sie in eine async - Funktion und await einfügen.

So konstruieren Sie diesen Flow mithilfe des Promise-Ergebnisses:

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

Hier ist ein anderer Weg mit einem anderen Ansatz für die Daten. Sie "transformieren ein Standarddatenobjekt basierend auf einer Antwort und übergeben es dann an einen res.json -Aufruf", damit Sie Folgendes tun können:

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)

So geht's mit 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}`
      })
   }
}

Sie können dies weiter komprimieren, indem Sie den Aufruf an inserirEmergencia einfügen:

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

Der letzte verdeckt die Seiteneingabe, was den Betreuern nicht hilft - auch Ihnen in Zukunft. Es ist nicht schlecht, aber Sie mischen dort die Datentransformation mit einem API-Aufruf, also würde ich es nicht tun. Fügen Sie es einfach hinzu, damit Sie mehr Informationen darüber erhalten, was möglich ist, wenn Sie Async in JS lernen.

1
Josh Wulf 22 Feb. 2020 im 02:39

Jede asynchrone Funktion gibt ein Versprechen zurück. Um zu verhindern, dass der nicht blockierende Code ausgeführt wird, können Sie diesen Code platzieren, nachdem das Versprechen aufgelöst wurde. d.h. durch Aufrufen der Rückruffunktion von .then oder einfach durch Warten auf das zu lösende Versprechen und anschließende Ausführung der Aufgabe.

0
A R 21 Feb. 2020 im 17:33

Wie Sie wahrscheinlich wissen, laufen die Dinge in node.js asynchron. Wenn Sie also möchten, dass die Dinge in einer bestimmten Reihenfolge ausgeführt werden, müssen Sie eine Steuerungsbibliothek verwenden oder sie im Grunde selbst implementieren.

Ich empfehle Ihnen, sich die folgenden Konzepte anzusehen:

1) Rückruffunktionen.

2) asynchron und warten

Mit diesen können Sie den Ausführungsfluss steuern.

3
Deepak Tatyaji Ahire 21 Feb. 2020 im 17:29