확장블럭 중 블로킹 기능을 필요로 하는 블럭을 만들어야 할 필요가 있다. 예를 들면 로봇의 경우 setDistance, setRotation 등 특정 거리나 특정 각도까지 움직이고, 이때 동작이 완료될 때까지 기다려야 하는 블럭이 존재한다.
Scratch 3.0의 Extension의 경우 개발 언어는 Javascript이다. 따라서 일반 언어에서 사용하듯 while 문을 이용한 제어가 불가능하다. 만약 while 문을 사용하면 스크립트 실행 자체가 멈춰버리므로, 프로그램 자체가 멈춰버리고, 이게 길게되면 각종 브라우저에서 에러와 같이 인식한다.
이를 구현하기 위해서 Promise와 setInterval의 조합으로 해결이 가능하다. 로봇이 움직이고 있다는 신호는 로봇의 상태 정보를 통해 파악할 수 있고, 움직이는 명령을 보낸 후, 로봇의 상태 정보를 지속적으로 모니터링하여 로봇의 동작이 완료되었음을 의미하는 플래그가 셋되면 블럭의 동작을 완료하면 된다.
기존 setDistance() 함수는 다음과 같이 되어 있다.
setDistance (args) {
const l_dist = parseInt(args.L_DIST);
const r_dist = parseInt(args.R_DIST);
this._peripheral.setDistance(l_dist, r_dist);
}
이제 여기에 플래그를 모니터링하고, 블럭의 동작을 완료하는 부분을 추가한다.
setDistance (args) {
const l_dist = parseInt(args.L_DIST);
const r_dist = parseInt(args.R_DIST);
this._peripheral.setDistance(l_dist, r_dist);
return new Promise(resolve => {
var first_check = true;
var ttt = setInterval(() => {
if(this._peripheral.isRobotMoving == false && first_check == true) {
first_check = false;
}
else if(this._peripheral.isRobotMoving == false && first_check == false) {
resolve();
clearInterval(ttt);
}
}, 100);
});
}
이제 로봇의 연결하고 위 블럭을 실행해보면, 다음과 같이 동작이 완료될 때까지 대기함을 볼 수 있다.
안녕하세요. 오랜만에 댓글을 달아봅니다 ㅎㅎ
다름이 아니라..제가 질문이 하나 생겼는데, 아마도 스크래치 관련되기 보다는 자바스크립트 관련 질문이지 않을까 싶습니다…ㅠ
현재 어느정도 스크래치 블록을 제작을 완료하여 통신쪽을 진행을 하고자 하는데..
혹시, 프로그램을 실행(npm start)하게 되면 터미널에 Compiled successfully라고 만 출력이 되고
제가 코드에 추가로 작성한 “Conlore.log”부분은 출력이 되지 않더라구요…
혹시 이런 상황에서 코드의 진행상황 및 구동이 제대로 되고 있는지 어떻게 확인을 할 수 있는지 아실까요….?ㅠ