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