es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo sincronizar las funciones asíncronas en Node.js

Realicé algunas operaciones en la base de datos y después algunas llamadas SOAP. Aquí está el resultado. No me pareció correcto. ¿Cómo puedo sincronizarlos en Node.js? Todas estas funciones son asíncronas.

Aquí está el código:

sccmConnectDB.getAllComputers().then(result => {
    computers = result[0]
    console.log("select from sccm db is completed...")
    caConnectDB.deletezSCCM2CM().then(result => {
        console.log("deleting from ca db zsccm2cm table is completed...");
        caConnectDB.insertzSCCM2CM(computers).then(result => {
            console.log("inserting ca db zsccm2cm table is completed...");
            login.login().then(sessionId => {
                console.log("login successfull");
                getHostName.getHostNames().then(result => {
                    hostNames = result[0]; 
                    console.log("query result for hostname -->", hostNames);
                    hostNames.forEach(element => {
                        uuid = "nr:" + element.uuid;
                        attrVals = { string: ["system_name", element.compName] };
                        attrbts = { Attributes: [] }
                        updateObject.updateObject(sessionId, uuid, attrVals, attrbts).then(result => {
                            console.log("Update successfull");
                        });
                    });
                    logout.logout(sessionId).then(result => {
                        console.log("logout successfull");
                    });
                });
            });
        });
    });
});
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para sincronizar estas funciones asíncronas en Node.js, se pueden utilizar Promesas y la sintaxis async/await.

    En primer lugar, envuelve cada función asíncrona dentro de una Promesa. Por ejemplo, la función sccmConnectDB.getAllComputers() se puede envolver de la siguiente manera:

    function getAllComputers() {
      return new Promise((resolve, reject) => {
        sccmConnectDB.getAllComputers((err, result) => {
          if (err) {
            reject(err);
          } else {
            resolve(result);
          }
        });
      });
    }
    

    Haz lo mismo para todas las demás funciones asíncronas.

    En segundo lugar, utiliza la sintaxis async/await en un bloque try...catch para esperar a que cada Promesa se resuelva antes de pasar al siguiente paso. Por ejemplo:

    async function synchronizeDB() {
      try {
        const computers = await getAllComputers();
        console.log("se completó la selección desde la base de datos de SCCM...");
    
        await caConnectDB.deletezSCCM2CM();
        console.log("se completó la eliminación de la tabla zsccm2cm desde la base de datos de CA...");
    
        await caConnectDB.insertzSCCM2CM(computers);
        console.log("se completó la inserción en la tabla zsccm2cm de la base de datos de CA...");
    
        const sessionId = await login.login();
        console.log("inicio de sesión exitoso");
    
        const hostNames = await getHostName.getHostNames();
        console.log("resultado de la consulta para hostname -->", hostNames);
    
        for (let element of hostNames) {
          const uuid = "nr:" + element.uuid;
          const attrVals = { string: ["system_name", element.compName] };
          const attrbts = { Attributes: [] };
          await updateObject.updateObject(sessionId, uuid, attrVals, attrbts);
          console.log("actualización exitosa");
        }
    
        await logout.logout(sessionId);
        console.log("cierre de sesión exitoso");
      } catch (err) {
        console.error(err);
      }
    }
    

    Ten en cuenta que se utiliza el bucle for...of en lugar de forEach, ya que forEach no se puede usar con await.

    Al envolver todas las funciones asíncronas dentro de Promesas y utilizar async/await, el código ahora ejecutará cada paso de forma sincrónica, sin avanzar hasta que se haya completado el paso anterior.

Comments are closed.