Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

163
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!