Saltar al contenido

Nodejs síncrono para cada ciclo

Verificamos exhaustivamente cada tutorial en nuestra web con el objetivo de enseñarte en todo momento la información con la mayor veracidad y certera.

Solución:

Con la recursión, el código es bastante limpio. Espere a que regrese la respuesta http y luego dispare el próximo intento. Esto funcionará en todas las versiones de node.

var urls = ['http://stackoverflow.com/', 'http://security.stackexchange.com/', 'http://unix.stackexchange.com/'];

var processItems = function(x)
  if( x < urls.length ) 
    http.get(urls[x], function(res) 

      // add some code here to process the response

      processItems(x+1);
    );
  
;

processItems(0);

Una solución que use promesas también funcionaría bien y es más concisa. Por ejemplo, si tiene una versión de get que devuelve una promesa y Node v7.6+, podría escribir una función async/await como este ejemplo, que usa algunas características nuevas de JS.

const urls = ['http://stackoverflow.com/', 'http://security.stackexchange.com/', 'http://unix.stackexchange.com/'];

async function processItems(urls)
  for(const url of urls) 
    const response = await promisifiedHttpGet(url);    
    // add some code here to process the response.
  
;

processItems(urls);

Nota: ambos ejemplos omiten el manejo de errores, pero probablemente debería tener eso en una aplicación de producción.

Para enlazar y encadenar sincrónicamente acciones asincrónicas, la solución más limpia es probablemente usar un biblioteca de promesas (Se están introduciendo promesas en ES6, este es el camino a seguir).

Usando Bluebird, esto podría ser

Var p = Promise.resolve();
forEach(sets, function(item, index, arr) {
    p.then(new Promise(function(resolve, reject) 
         http.get(theUrl, function(res) 
         ....
         res.on('end', function() 
              ...
              resolve();
         
    ));
);
p.then(function()
   // all tasks launched in the loop are finished
);

Descubrí que no estaba liberando mis conexiones mysql después de que terminé con cada llamada y esto ató las conexiones, lo que provocó que fallara y pareciera ser un problema con la sincronización.

Después de llamar explícitamente connection.release(); hizo que mi código funcionara al 100 % correctamente, incluso de forma asíncrona.

Gracias por aquellos que publicaron en esta pregunta.

Aquí puedes ver las reseñas y valoraciones de los usuarios

Puedes añadir valor a nuestro contenido informacional participando con tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *