Angular 서비스가 상태를 가져야 합니까?
최근에 몇몇 동료들과 나는 Angular에 대해 토론하고 있었다.JS 서비스에는 스테이트가 있어야 합니다.우리는 그것에 대한 찬반 논쟁을 했고 나는 그 주제에 대해 더 많은 생각과 피드백을 얻고 싶었다.검색 결과, 이것을 발견했지만, 명확한 베스트 프랙티스가 언급되어 있지 않은 것 같습니다.비클라이언트측 세계에서는 서비스가 상태를 유지해서는 안 됩니다만, 다른 문제이기 때문에 클라이언트측에서 받아들일 수 있는 것이 아닌가 하는 생각이 들기 시작했습니다.
서비스가 상태를 유지하는 이유:
- 여러 스레드에서 서비스에 액세스할 수 없습니다.각 브라우저에는 자체 서비스 인스턴스가 있습니다.
- 서비스가 rootScope에 저장하지 않고 관심 있는 상태만 유지할 수 있도록 합니다.캡슐화
서비스가 상태를 유지하지 않는 이유:
- 서비스는 더 이상 쓸모없는 것이 아닙니다.호출 함수는 상태가 변경될 수 있으므로 서비스 상태에 따라 호출할 때 결과가 달라질 수 있습니다.
- 저는 이것이 전반적으로 테스트하기 더 쉬울 것이라고 생각합니다.
"서비스 홀딩 상태" 섹션에서 #2를 다루는 한 가지 방법은 애플리케이션의 현재 상태를 포함하는 rootScope에 appState 개체를 설정하는 것입니다.그러면 모든 주가 한 곳에 모일 수 있습니다. 그런 다음 필요한 것을 꺼내서 서비스를 할 수 있습니다.이걸 발견해서 궁금했어
"주"가 무엇을 의미하느냐에 따라 달라질 수 있지만, 대부분의 경우 대답은 "그렇다"입니다.서비스는 주를 유지해야 합니다.
예를 들어 API와의 통신을 담당하는 서비스가 있는 경우 해당 서비스가 인증 상태를 유지할 수 있습니다.
그나저나, 앵글이 얼마나 게으른지 모르겠어JS 서비스 - 싱글톤이기 때문에 기본적으로 어느 정도의 상태가 있습니다.서비스에 대해 idempotent 메서드를 작성할 수 있지만(경우에 따라서는 작성해야 합니다), 이는 별개의 문제입니다.
AngularJS에서 서비스는 공장 기능을 통해 전달됩니다.기본적으로는 작업 수행에 필요한 데이터를 캐싱하거나 저장하는 등의 상태를 포함할 수 있는 개체입니다.
상태가 있는지 없는지 여부를 모두 고려할 수 있는 좋은 해결책 중 하나는 상태가 포함된 개체를 반환하는 서비스(실제로 기능할 수 있음)입니다.
, 그럼 여러분도 한번 .$http
service:이 서비스의 수 .「 」 。
var x = $http({url:'...'});
그리고 나서 들르세요
var result = x.get() //actually `$http.get` is shortcut of this operation
같다ngResource
하여 원하는 할 수 있는 수 서비스를 사용하여 원하는 액션을 수행할 수 있는 상태의 개체를 얻을 수 있습니다.
따라서 기본적으로 이것이 최선의 선택이라고 생각합니다.어떤 시점부터 액션에 의해 변경되어 서비스 자체에 저장되지 않고 개별 객체로 이동할 수 있는 상태를 유지함으로써 '부작용'을 피할 수 있습니다.그러나 그 객체에 커스텀 정보(auth information 등)를 저장할 수 있도록 특정 상태를 가질 수 있습니다.
IMO 네, 서비스에는 상태를 지정할 수 있습니다.서비스로서의 「캔」은, 종래의 비클라이언트 서비스(프로바이더)와 비슷하다고 생각할 수 있습니다만, angularJ에서는 전혀 다른 것을 의미할 수도 있습니다.예를 들어 앱의 rootScope-y 단일 인스턴스 요소로서 상태 관리에만 사용할 수 있습니다.이를 통해 많은 애플리케이션에서 상태 구조가 동일하도록 할 수 있으며 부트스트래핑 내에서 각각의 개별 상태 구조가 정의되어 있더라도 세션 상태 같은 것은 모듈이 변경되면 항상 동일하고 업데이트됩니다.
서비스가 상태를 유지해서는 안 되는 이유는 서비스에 액세스하는 여러 스레드가 있을 때 레이스 상태가 되기 때문입니다.
서비스 상태의 일반적인 문제는 다음과 같습니다.
- 스레드 1은 스테이트에 씁니다.
- 스레드 2는 스테이트에 기입합니다.
- 스레드 1은 상태를 읽습니다.
- 스레드 2는 상태를 읽습니다.
스레드 1에 잘못된 값이 지정되었습니다.
단, javascript는 현재 싱글 스레드이기 때문에 이와 같은 스레드 액세스 문제는 발생하지 않습니다.다만, 복수의 비동기 $http 콜이 모두 같은 서비스 변수에 기입되는 서비스가 있으면 곤란합니다.밤에 잠을 잘 잘 수 있다면 서비스 방법을 모두 써서 실제 데이터에 대한 패스스루가 되도록 하겠습니다.
대신 서비스 상태를 유지하는 것이 아니라 가능한 한 백엔드에 상태를 넣는 것을 검토할 수 있습니다."인증됨" 또는 균일한 폭과 높이와 같은 것들을 유지하고 쿼리할 수 있습니다.이것에 의해, 유저가 앱으로부터 벗어나, 돌아와, 모든 설정이 아직 셋업 되어 로그인하고 있는 것을 확인할 수 있는 몇개의 가능성이 열려 있습니다.쿠키에 세션 ID를 저장하고 이 모든 내용을 백엔드에 저장할 수 있습니다.
상태를 저장하는 다른 개체를 갖는 경로를 선택한 경우 상태 변경 시 서비스에서 $emit할 수 있습니다. 즉, 공장에서 이벤트를 내보내는 방법입니다.이 경우 상태가 하나의 서비스에 저장되지 않기 때문에(또는 여러 서비스에 분산되어 있지 않기 때문에) 여러 서비스가 통합된 애플리케이션 상태를 변경할 수 있다는 단점이 있습니다.
언급URL : https://stackoverflow.com/questions/14241900/should-an-angular-service-have-state
'programing' 카테고리의 다른 글
PHP를 사용하여 JSON POST 읽기 (0) | 2023.03.26 |
---|---|
Spring Boot 2.2.0에서의 x-forwarded 헤더에 대처하는 방법(역프록시 배후에 있는 Spring Web MVC) (0) | 2023.03.26 |
아이폰의 JSON 및 코어 데이터 (0) | 2023.03.21 |
React에 내장된 프로덕션과 개발의 차이점JS (0) | 2023.03.21 |
리액트 라우터를 사용하여 프로그래밍 방식으로 탐색 (0) | 2023.03.21 |