4달 전 · 전재욱 님의 새로운 댓글
자바스크립트의 이벤트 처리 질문
리액트로 이미지 inpainting 컴포넌트를 만들고 있습니다. 사용자가 이미지 업로드를 하면 canvas 영역에 그 이미지가 채워지고 그 이미지에 mask 영역을 칠할 수 있는 이미지 에디터 컴포넌트인데요, 궁금한게 생겨 질문드립니다. 첨부한 코드는 컴포넌트의 코드중 이미지 업로드 시 onChange 이벤트의 처리기인 handleImageUpload 함수와, handleImageUpload 함수에서 호출되는 loadImage 함수의 코드입니다. 사용자가 input 요소에 이미지를 업로드하면 onChange 이벤트가 발생해 handleImageUpload 함수가 실행되고 loadImage 함수가 실행됩니다. loadImage 함수가 실행되면 img 객체가 생성되고 img 객체의 src를 지정하죠. 그러면 브라우저는 이미지 로딩을 시작하고 이미지 로딩이 완료되면 onload 콜백함수가 실행됩니다. 저는 이 과정을 자바스크립트의 콜스택, 이벤트 루프, 태스크큐 구조에서 나타내보자면 다음과 같다고 생각했습니다. 1. 초기상태 콜스택 : [ ] 태스크큐 : [ ] 2. 사용자가 파일을 업로드 -> onChange 이벤트 발생 콜스택 : [handleImageUpload] 태스크큐 : [ ] 3. handleImageUpload 내부에서 loadImage 함수 호출 콜스택 : [handleImageUpload, loadImage] 태스크큐 : [ ] 4. loadImage 내부에서 img 객체 생성 및 src 할당 콜스택 : [handleImageUpload, loadImage] 태스크큐 : [ ] Web API : 이미지 로딩 시작 5. loadImage 함수 종료, handleImageUpload 함수 종료 콜스택 : [ ] 태스크큐 : [ ] Web API : 이미지 로딩 진행중 6. 이미지 로딩이 완료되면 Web API가 onload 콜백을 태스크큐에 추가 콜스택 : [ ] 태스크큐 : [onload] Web API : 이미지 로딩 완료 7. 이벤트 루프가 콜스택이 비어있음을 확인하고 태스크큐에서 onload 콜백을 콜스택으로 이동 콜스택 : [onload] 태스크큐 : [ ] 8. onload 콜백 실행 (캔버스에 이미지 그리기 등) 콜 스택 : [onload, drawImage, ...] 태스크큐 : [ ] 일단 이 과정이 맞나요? 만약 이게 맞다면 생기는 궁금증이 있습니다. Web API에서 이미지 로딩이 진행되는동안 loadImage 함수 및 handleImageUpload 함수가 종료되면 loadImage 함수 내에서 생성된 img 객체는 가비지 컬렉터에 의해 지워져야 하지 않나? 그렇게 img 객체가 GC에 의해 사라지면 이미지 로딩이 완료되었을 시점엔 img 객체의 onload 함수도 없어진것이니 onload 함수의 로직은 실행이 되지 않아야 하는 거 아닌가? 하는 생각이 들어 질문드립니다
개발자
#자바스크립트
#react
#frontend
답변 1
댓글 1
조회 249
10달 전 · 짹 님의 새로운 답변
콜백함수부분에 대해 질문있습니다.
안녕하세요 현재 자바스크립트를 공부하고 있는 초보자입니다. 현재 위치를 보여주는 코드를 작성하면서 궁금한 점이 생겼습니다. const askForLocation = function () { navigator.geolocation.getCurrentPosition((position) => { console.log(position); }); }; askForLocation(); 이러한 코드가 있는데 제가 알기론 ()=>{} 콜백함수에 매개변수로 position이 있고 제일 마지막에 askForLocation() 함수 호출하는게 있는데 이 함수 호출부분에서 인자로 아무것도 전달되는것이 없어서 console.log(position)를 했을 때 undefined가 나올 것을 예상했는데 geolocation의 객체정보가 콘솔창에 나오더라구요. 그래서 매개변수로 전달 될 만한것이 없는데 어떻게 콘솔창에 객체정보가 나오는지 궁금합니다. 초보자 입장에서 정말 쉽게 설명해주시면 너무 감사드리겠습니다.
개발자
#함수
#콜백함수
#프론트엔드
#자바스크립트
답변 1
댓글 0
보충이 필요해요 1
조회 44
일 년 전 · 오지운 님의 답변 업데이트
react에서 상태업데이트 로직 자체가 실행이 안되는 경우도 있나요?
React에서 Modal이 Modal을 호출하는 다중 Modal 구현중 난제를 만나게 되어 질문을 올립니다 소스의 경우 복붙보다는 github 주소를 남기는것이 좋을것 같아서 github링크로 대체하는점 양해부탁드립니다. https://github.com/graylobo/modalTest (간단해서 clone후 바로 실행가능합니다) 로직에 대해 설명을 하자면 아래와 같습니다. 편의상 음슴체로 하는점 양해부탁드립니다. 1. 전역에서 사용될 기본Modal 을 정의 (BaseModal) 2. BaseModal의 on/off의 경우 recoil로 관리 3. useModalStack 을 사용하여 custom modal (TestModal1,2)을 열수있음 4. custom modal은 다른 custom modal을 호출할수 있으며, modal 호출자는 피호출자의 상태를 공유할수 있음. 즉 SomeComponent가 TestModal1을 호출하고, TestModal1이 또다시 TestModal2를 호출했을때, TestModal2의 상태값을 TestModal1에서 받을수 있으며, TestModal1의 상태값을 SomeComponent에서 받을수 있음 위 기능까지는 문제없이 동작하며, SomeComponent의 경우 TestModal1에서 자신의 로컬상태(inputData)가 있고 확인버튼 클릭시 currentModal.handleConfirm?.(inputData) 가 호출되고 SomeComponent의 handleConfirm에 지정한 콜백로직이 실행되면서 setReceivedData를 통해 receivedData의 상태 업데이트가 TestModal1에서 전달한 inputData로 정상적으로 업데이트가 됨. 또한 SomeComponent가 TestModal1을 호출한 프로세스와 마찬가지로, TestModal1에서 TestModal2 를 호출하고 TestModal2에서 자신의 로컬상태(inputData)가 있고 확인버튼을 클릭하여 currentModal.handleConfirm?.(inputData)를 호출하면 TestModal1의 handleConfirm에 지정한 콜백로직이 실행되면서 TestModal2에서 전달한 inputData를 받는것 까지는 정상적으로 동작하는데 여기서 문제는 TestModal1의 setReceivedData를 통해 receivedData의 상태가 TestModal2에서 전달한 inputData로 업데이트가 되어야 하는데 디버깅시 setReceivedData 자체가 아예실행이 되지않음. react개발하면서 useState의 set함수에 전달하는 콜백함수 자체가 실행이 안되는거는 처음 겪어보고 레퍼런스도 없어서 혹시 저와 동일한 문제를 겪거나 해결방안을 알고 계시는 분이 있다면 조언주시면 매우 감사하겠습니다.
개발자
#react
답변 2
댓글 6
조회 135
일 년 전 · 신기정 님의 댓글 업데이트
node.js에서 API를 만들 때 콜백 함수를 많이 사용하나요?
안녕하세요 node.js express 강의를 듣고 있는 예비 (FE) 개발자입니다. 현재 back-end 역량을 키우기 위해 인프런의 `따라하며 배우는 노드, 리액트 시리즈 - 기본강의`를 수강중인데요 API를 만들때 콜백 함수를 많이 사용하고 메소드를 만들 때에도 콜백함수를 매개변수로 넣어서 결괏값을 콜백함수에 전달하도록 만들기도 하더라구요. 저는 왠지 이게 불편해서 promise 문법(.then .catch...)으로 바꿔보고 있었는데 문득 콜백을 사용하는 내가 모르는 이유가 있지 않을까? 하는 생각이 들었고, 현재 개발 트렌드도 궁금해졌습니다. 현재 개발 환경에서도 모종의 이유(JS의 태생적 한계?)로 프로미스 문법보다는 콜백을 많이 사용하는지, 아니면 오래된 강의(2020년)라 그런건지, 그냥 사바사인지 궁금합니다!
개발자
#node.js
#express
답변 1
댓글 1
조회 469
일 년 전 · 김주호 님의 답변 업데이트
노드 공부하다가 궁금해서 질문드립니다
예를 들어 settimeout의 시간을 1초로 하고 1초가 지난후에 콜백함수를 실행할 시점에 call stack이 비어있지않아서 다른 함수나 코드를 실행하고있을경우에 이 1초라는 시간을 보장할 수 없는건가요?
개발자
#nodejs
답변 2
댓글 0
조회 74
2년 전 · 박예진 님의 질문 업데이트
stompjs, WebSocket을 활용한 채팅에서 subscribe 콜백함수 실행 안 되는 오류
stompjs, WebSocket을 활용한 채팅에서 subscribe 콜백함수 실행 안 되는 오류입니다. 일단 버전은 stompjs 2.3.3 입니다. 채팅 connect와 subscribe 잘 되는 거 확인했고, 다른 chatting 페이지에서 send까지 하면서, 채팅되는 거 확인했는데 onMessageReceived라는 콜백함수가 실행되지 않아요. 그래서 채팅내역을 못 불러오고 있어요.. 도와주세요 ㅠㅠ 아래 사진은 connect, subscribe, send 과정입니다.
개발자
#react
#stompjs
#websocket
답변 0
댓글 0
조회 127
2년 전 · 커리어리 AI 봇 님의 새로운 답변
useEffect에서 useState를 동기로 쓸 수 있는 방법이 있을까요?
useEffect에서 useState를 동기로 쓸 수 있는 방법이 있을까요 ? set 함수에 콜백함수를 넘겨줘도 비동기로 작동을 하네요. 코드는 아래와 같은 상황입니다.
개발자
#react
#react-hook
#useeffect
#usestate
답변 2
댓글 0
조회 575
2년 전 · 황민호 님의 새로운 댓글
클로저 문제에 대해 질문이 있습니다.
아주 유명한 클로저 문제인데요 해당 코드에서 setTimeout의 콜백함수가 10번 생기게 되는데, 이 때 바깥의 func함수의 변수 i는 10개가 생기는 건가요? 아니면 한 개만 생기는건가요?
개발자
답변 2
댓글 1
추천해요 3
보충이 필요해요 1
조회 257