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

165
Vistas
Async-await no funciona como esperaba en forEach loop

Estoy usando WebRTC para intentar conectar dos usuarios. Llamo a createOffer y luego configuro la descripción local de la conexión entre pares usando lo que devuelve createOffer. No sé por qué me sale el siguiente error:

Nota: estoy usando firebase firestore como servidor de señalización

No capturado (en promesa) DOMException: no se puede establecer una oferta local cuando no se ha llamado a createOffer.

Aquí está mi código:

 async function preformSignaling() { let users = await negDoc.collection("users").get(); let newPeerConnection; users.forEach(async (doc) => { if (isNotAlreadyConnected(doc.id)) { newPeerConnection = new UserConnection(servers, doc.id); if (doc.id != sessionStorage.getItem("userID") && doc.id != "metadata") { let connOfferDescription = await newPeerConnection.userPeerConnection.createOffer(); await newPeerConnection.userPeerConnection.setLocalDescription( connOfferDescription ); await doc.collection("offer-candidates").doc("offer").set({ offer: newPeerConnection.userPeerConnection.localDescription, }); } peerConnections.push(newPeerConnection); } }); } class UserConnection { constructor(servers, remoteUserID) { this.userPeerConnection = new RTCPeerConnection(servers); this.remoteStream = new MediaStream(); this.remoteUserID = remoteUserID; } getRemoteUserID() { return this.remoteUserID; } }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Estoy dando un poco de puñalada ciega aquí, pero usar async-await en un forEach (o mapa, filtro, reducción, etc.) es un problema común. Básicamente, solo dispara un montón de llamadas asíncronas.

No esperará a que termine lo que está sucediendo en esa devolución de llamada antes de disparar la siguiente. Las partes internas de forEach tendrían que esperar la devolución de llamada y la devolución de llamada debe devolver una promesa.

Debido a que ha let newPeerConnection fuera del ciclo, probablemente esté escribiendo esa variable varias veces antes de que finalice cualquiera de las llamadas a createOffer .

Podría traer esa variable dentro del ciclo si ninguna de estas llamadas simultáneas se afectará entre sí. De lo contrario, solo use un bucle for-of si desea ejecutarlos uno por uno. Eso podría ser algo como esto:

 async function preformSignaling() { let users = await negDoc.collection('users').get(); let newPeerConnection; for (let doc of users) { if (!isNotAlreadyConnected(doc.id)) continue; newPeerConnection = new UserConnection(servers, doc.id); if ( doc.id !== sessionStorage.getItem('userID') && doc.id !== 'metadata' ) { let connOfferDescription = await newPeerConnection.userPeerConnection.createOffer(); await newPeerConnection.userPeerConnection.setLocalDescription( connOfferDescription ); await doc.collection('offer-candidates').doc('offer').set({ offer: newPeerConnection.userPeerConnection.localDescription, }); } peerConnections.push(newPeerConnection); } }

Tenga en cuenta un par de cambios menores allí para mejores prácticas: !== no !=, y verifique el inverso del bool y continúe temprano para evitar la pirámide de la perdición.

about 4 years ago · Juan Pablo Isaza 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