-
Notifications
You must be signed in to change notification settings - Fork 4
⚫ forEach는 async를 기다려주지 않는다
Junsang Yu edited this page Nov 30, 2024
·
1 revision
forEach 는 동기적으로 동작하기 때문에 비동기 작업의 완료를 기다리지 않고 다음 반복(iteration)으로 넘어간다.
m2-res_480p.mp4
따라서 아래와 같은 코드를 실행했을 때, 우리가 기대하는 결과(순차적으로 offer 등록하고 sendOffer 이벤트를 발생)를 얻을 수 없다.
socket.on('offerRequest', (data) => {
users.forEach(async (oldId) => {
const peerConnection = new RTCPeerConnection();
peerConnectionMap.set(oldId, peerConnection);
localStream
.getTracks()
.forEach((track) => peerConnection.addTrack(track, localStream));
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
socket.emit("sendOffer", { socketId: socket.id, offer });
});
});원하는 결과를 얻기 위해서는 for...of 혹은 Promise.all과 map 을 사용해주어야 한다.
socket.on('offerRequest', async (data) => {
for(const oldId of users) {
const peerConnection = new RTCPeerConnection();
peerConnectionMap.set(oldId, peerConnection);
localStream
.getTracks()
.forEach((track) => peerConnection.addTrack(track, localStream));
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
socket.emit("sendOffer", { socketId: socket.id, offer });
});
});socket.on('offerRequest', async (data) => {
const connections => users.map(async (oldId) => {
const peerConnection = new RTCPeerConnection();
peerConnectionMap.set(oldId, peerConnection);
localStream
.getTracks()
.forEach((track) => peerConnection.addTrack(track, localStream));
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
socket.emit("sendOffer", { socketId: socket.id, offer });
});
await Promise.all(connections);
});