programing

Angular 서비스가 상태를 가져야 합니까?

testmans 2023. 3. 21. 21:48
반응형

Angular 서비스가 상태를 가져야 합니까?

최근에 몇몇 동료들과 나는 Angular에 대해 토론하고 있었다.JS 서비스에는 스테이트가 있어야 합니다.우리는 그것에 대한 찬반 논쟁을 했고 나는 그 주제에 대해 더 많은 생각과 피드백을 얻고 싶었다.검색 결과, 이것을 발견했지만, 명확한 베스트 프랙티스가 언급되어 있지 않은 것 같습니다.비클라이언트측 세계에서는 서비스가 상태를 유지해서는 안 됩니다만, 다른 문제이기 때문에 클라이언트측에서 받아들일 수 있는 것이 아닌가 하는 생각이 들기 시작했습니다.

서비스가 상태를 유지하는 이유:

  1. 여러 스레드에서 서비스에 액세스할 수 없습니다.각 브라우저에는 자체 서비스 인스턴스가 있습니다.
  2. 서비스가 rootScope에 저장하지 않고 관심 있는 상태만 유지할 수 있도록 합니다.캡슐화

서비스가 상태를 유지하지 않는 이유:

  1. 서비스는 더 이상 쓸모없는 것이 아닙니다.호출 함수는 상태가 변경될 수 있으므로 서비스 상태에 따라 호출할 때 결과가 달라질 수 있습니다.
  2. 저는 이것이 전반적으로 테스트하기 더 쉬울 것이라고 생각합니다.

"서비스 홀딩 상태" 섹션에서 #2를 다루는 한 가지 방법은 애플리케이션의 현재 상태를 포함하는 rootScope에 appState 개체를 설정하는 것입니다.그러면 모든 주가 한 곳에 모일 수 있습니다. 그런 다음 필요한 것을 꺼내서 서비스를 할 수 있습니다.이걸 발견해서 궁금했어

"주"가 무엇을 의미하느냐에 따라 달라질 수 있지만, 대부분의 경우 대답은 "그렇다"입니다.서비스는 주를 유지해야 합니다.

예를 들어 API와의 통신을 담당하는 서비스가 있는 경우 해당 서비스가 인증 상태를 유지할 수 있습니다.

그나저나, 앵글이 얼마나 게으른지 모르겠어JS 서비스 - 싱글톤이기 때문에 기본적으로 어느 정도의 상태가 있습니다.서비스에 대해 idempotent 메서드를 작성할 수 있지만(경우에 따라서는 작성해야 합니다), 이는 별개의 문제입니다.

AngularJS에서 서비스는 공장 기능을 통해 전달됩니다.기본적으로는 작업 수행에 필요한 데이터를 캐싱하거나 저장하는 등의 상태를 포함할 수 있는 개체입니다.

상태가 있는지 없는지 여부를 모두 고려할 수 있는 좋은 해결책 중 하나는 상태가 포함된 개체를 반환하는 서비스(실제로 기능할 수 있음)입니다.

, 그럼 여러분도 한번 .$httpservice:이 서비스의 수 .「 」 。

var x = $http({url:'...'});

그리고 나서 들르세요

var result = x.get() //actually `$http.get` is shortcut of this operation

같다ngResource하여 원하는 할 수 있는 수 서비스를 사용하여 원하는 액션을 수행할 수 있는 상태의 개체를 얻을 수 있습니다.

따라서 기본적으로 이것이 최선의 선택이라고 생각합니다.어떤 시점부터 액션에 의해 변경되어 서비스 자체에 저장되지 않고 개별 객체로 이동할 수 있는 상태를 유지함으로써 '부작용'을 피할 수 있습니다.그러나 그 객체에 커스텀 정보(auth information 등)를 저장할 수 있도록 특정 상태를 가질 수 있습니다.

IMO 네, 서비스에는 상태를 지정할 수 있습니다.서비스로서의 「캔」은, 종래의 비클라이언트 서비스(프로바이더)와 비슷하다고 생각할 수 있습니다만, angularJ에서는 전혀 다른 것을 의미할 수도 있습니다.예를 들어 앱의 rootScope-y 단일 인스턴스 요소로서 상태 관리에만 사용할 수 있습니다.이를 통해 많은 애플리케이션에서 상태 구조가 동일하도록 할 수 있으며 부트스트래핑 내에서 각각의 개별 상태 구조가 정의되어 있더라도 세션 상태 같은 것은 모듈이 변경되면 항상 동일하고 업데이트됩니다.

서비스가 상태를 유지해서는 안 되는 이유는 서비스에 액세스하는 여러 스레드가 있을 때 레이스 상태가 되기 때문입니다.

서비스 상태의 일반적인 문제는 다음과 같습니다.

  1. 스레드 1은 스테이트에 씁니다.
  2. 스레드 2는 스테이트에 기입합니다.
  3. 스레드 1은 상태를 읽습니다.
  4. 스레드 2는 상태를 읽습니다.

스레드 1에 잘못된 값이 지정되었습니다.

단, javascript는 현재 싱글 스레드이기 때문에 이와 같은 스레드 액세스 문제는 발생하지 않습니다.다만, 복수의 비동기 $http 콜이 모두 같은 서비스 변수에 기입되는 서비스가 있으면 곤란합니다.밤에 잠을 잘 잘 수 있다면 서비스 방법을 모두 써서 실제 데이터에 대한 패스스루가 되도록 하겠습니다.

대신 서비스 상태를 유지하는 것이 아니라 가능한 한 백엔드에 상태를 넣는 것을 검토할 수 있습니다."인증됨" 또는 균일한 폭과 높이와 같은 것들을 유지하고 쿼리할 수 있습니다.이것에 의해, 유저가 앱으로부터 벗어나, 돌아와, 모든 설정이 아직 셋업 되어 로그인하고 있는 것을 확인할 수 있는 몇개의 가능성이 열려 있습니다.쿠키에 세션 ID를 저장하고 이 모든 내용을 백엔드에 저장할 수 있습니다.

상태를 저장하는 다른 개체를 갖는 경로를 선택한 경우 상태 변경 시 서비스에서 $emit할 수 있습니다. 즉, 공장에서 이벤트를 내보내는 방법입니다.이 경우 상태가 하나의 서비스에 저장되지 않기 때문에(또는 여러 서비스에 분산되어 있지 않기 때문에) 여러 서비스가 통합된 애플리케이션 상태를 변경할 수 있다는 단점이 있습니다.

언급URL : https://stackoverflow.com/questions/14241900/should-an-angular-service-have-state

반응형