관찰자 모델의 프로젝트 실천
업무 장면
프로젝트는 단일 페이지 웹 응용 프로그램으로 서버와 통신하는 데 사용되는 웹 소켓 서비스가 있습니다.처음에는 주로 두 가지 작용이 있었다.
처음에는 이렇게 이루어졌다.
//BasciWebsocket.js
websocket.onmessage = function (event) {
try{
let {data} = event;
let _data = JSON.parse(data);
switch(_data.type){
case 100:
Modal.warning({
title: ' ',
content: " , 。 , 。",
okText: ' ',
onOk: ()=> {
tool.clearUserCookie();
window.location = "/login";
}
});
break;
case 101:
let isPageShow = tool.ifDeliveryPageShow();
if(isPageShow){
// “ , ”
}
break;
}
}catch(e){
}
};
보아하니 아무런 문제가 없는 것 같다.그러나 프로젝트가 갈수록 복잡해지면서 웹소켓이 알림을 맡는다는 소식도 풍부해지고 있다.메시지를 받은 후에 종종 구체적인 페이지 표현을 바꾸어야 하기 때문에 구체적인 페이지와 관련성이 매우 크다.예를 들어 사용자가 주문 상세 페이지에 머물 때 새로운 주문 피드백을 받으면 주문 상세 페이지의 평론 목록 구역에 새로운 피드백 정보가 애니메이션으로 나와야 한다.
이럴 때 구체적인 페이지의 강도와 관련된 논리를 기초적인
BasciWebsocket.js
파일에 쓰는 것은 과학적이지 않고 BasciWebsocket.js
비대해져서 유지하기가 좀 힘들다는 것을 알게 될 것이다.문제는 기본적인 웹소켓 서비스와 모든 페이지의 메시지 처리 논리가 결합되지 않는다는 데 있다.어렵지 않게 알 수 있듯이 이 업무 장면에서 웹소켓 서비스는 사실 하나의 정보 발표자이고 이런 구체적인 페이지는 정보 구독자이다.자연스레 나는 생명의 볏짚인 고전적인 발표-구독 모드(관찰자 모드라고도 부른다)를 생각했다.
관찰자 모드
관찰자 모드는 대상 간의 일대다 의존 관계를 정의합니다. 대상의 상태가 바뀌면 모든 의존 대상이 알림을 받습니다.
어떻게 관찰자 모델을 실현합니까?
실천
우선
BasciWebsocket.js
을 정보 발표자로 변신:export default class BasicWebsocket{
constructor() {
if(typeof BasicWebsocket.instance === 'object') {
return BasicWebsocket.instance;
}
//
this.listeners = {};
this.init();
BasicWebsocket.instance = this;
}
//
addListener = (key,func)=>{
this.listeners[key] = func;
};
//
removeListener = (key)=>{
delete this.listeners[key];
};
init = ()=>{
// websocket ,
let websocket = this.getWebsocket();
let that = this;
// websocket
websocket.onmessage = function (event) {
try{
let {data} = event
let _data = JSON.parse(data);
// ,
let keys = Object.keys(that.listeners);
for(let i = 0,j = keys.length; i < j; i++){
let func = that.listeners[keys[i]];
func(_data);
}
}catch(e){
}
};
};
//
}
그리고 발송 관리 페이지에 불러올 때 발송 메시지를 구독할 수 있습니다.배송 관리 페이지를 마운트 해제할 때 메시지를 취소합니다.다른 페이지는 이렇게 유추한다.
class Distribution extends Component{
//
constructor(props) {
super(props);
//
this.state = {
newCount:0
};
this.websocket = new BasicWebsocket();
}
//
componentDidMount() {
let that = this;
//
this.websocket.addListener("distribution",(d)=>{
if(d.type == 101){
that.showNotification(); // “ , ”
//
let {count} = d.data;
let count = that.state.newCount + count;
that.setState({
newCount:count
});
}
});
}
//
componentWillUnmount() {
//
this.websocket.removeListener("distribution");
}
}
이로써 관찰자 모델을 통해 기초적인 웹소켓 서비스와 구체적인 페이지 논리의 결합을 실현하고 코드의 유지보수성을 향상시켰다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.