Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

137
Vistas
La función de bucle con socket no funciona - WebSocket

Tengo un punto final de socket, al que me conecto y envío un mensaje para obtener un usuario. Usé este código para hacerlo:

 import generateConnection from './generate-connection';

export async function fetchUser(id: number) {
 return new Promise(function (resolve) {
 const connection = generateConnection();
 connection.onopen = () => {
 connection.send(
 JSON.stringify(
 '{"msg":"connect","version":"1","support":["1","pre2","pre1"]}',
 ),
 );
 connection.send(
 JSON.stringify(
 `{"msg":"method","id":"1","method":"Users.getUser","params":[${id}]}`,
 ),
 );
 console.log('Connected');
 };
 connection.on('message', async (event) => {
 const data = event.toString();
 if (data[0] == 'a') {
 const a = JSON.parse(JSON.parse(data.substring(1))[0]);
 if (a.msg == 'result') {
 if ('error' in a) {
 console.log('Error' + a.error.msg);
 return null;
 } else {
 resolve(a.result);
 }
 }
 }
 });
 connection.on('error', function (error) {
 console.log('Connection Error: ' + error.toString());
 });
 connection.on('close', function () {
 console.log('echo-protocol Connection Closed');
 });
 });
}

const fetchAllUsers = async () => {
 for (let i = 0; i < 100; i++) {
 const user: any = await fetchUser(i);
 console.log(user.name);
 }
};
fetchAllUsers();

Obtengo el siguiente resultado:

 Connected
Jack

Simplemente me da el primer usuario y se detiene en el segundo.

No tengo control sobre el socket y quiero poder recuperar los 5000 usuarios cada día para sincronizarlos.

Estoy usando WebSocket para este problema.

Si tienes alguna propuesta que no sea este método, soy todo oídos :D

Para explicar más:

1 - Quiero abrir una conexión

2 - Enviar un mensaje

3 - obtener resultado

4 - Agregar a Array o db

5 - Cuando termine, cierre la conexión.

6 - repetir

almost 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿Por qué cerrarías la conexión cada vez? Una conexión abierta le permite enviar muchos mensajes. Pero tal vez sea más fácil:

 connection.close()

// right before:
resolve(a.result);

Si eso no funcionó, tal vez sea hora de enviar más de una solicitud por conexión. Prueba esto (estoy un poco oxidado con las promesas, así que espero que captes la idea y lo mejores)

 import generateConnection from './generate-connection';

export async function fetchAllUsers() {
 var total = 100;
 var returned = 0;
 var all_results = [];

 return new Promise(function(resolve) {
 const connection = generateConnection();
 connection.onopen = () => {
 connection.send(
 JSON.stringify(
 '{"msg":"connect","version":"1","support":["1","pre2","pre1"]}',
 ),
 );

 for (var i = 0; i < total; i++) {
 connection.send(
 JSON.stringify(
 `{"msg":"method","id":"1","method":"Users.getUser","params":[${i}]}`,
 ),
 );
 }

 console.log('Connected');
 };
 connection.on('message', async(event) => {
 const data = event.toString();
 if (data[0] == 'a') {
 const a = JSON.parse(JSON.parse(data.substring(1))[0]);
 if (a.msg == 'result') {
 if ('error' in a) {
 console.log('Error' + a.error.msg);
 return null;
 } else {
 console.log(a.result.name);
 all_results.push(a.result);

 returned++;

 if (returned == total) {
 resolve(all_results);
 }

 }
 }
 }
 });
 connection.on('error', function(error) {
 console.log('Connection Error: ' + error.toString());
 });
 connection.on('close', function() {
 console.log('echo-protocol Connection Closed');
 });
 });
}


fetchAllUsers();

almost 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda