programing

구독이 더 이상 사용되지 않음:오류 콜백 대신 관찰자 사용

prostudy 2022. 3. 11. 22:36
반응형

구독이 더 이상 사용되지 않음:오류 콜백 대신 관찰자 사용

내가 린터를 돌리면 다음과 같이 되어 있다.

subscribe is deprecated: Use an observer instead of an error callback

코드(각-cli가 있는 각도 7 앱에서):

    this.userService.updateUser(data).pipe(
       tap(() => {bla bla bla})
    ).subscribe(
       this.handleUpdateResponse.bind(this),
       this.handleError.bind(this)
    );

뭘 어떻게 사용해야 하는지...

고마워!

subscribe더 이상 사용되지 않고, 당신이 사용하고 있는 변종만 더 이상 사용되지 않는다.미래에subscribe오직 하나의 주장만을 받아들일 것이다: 어느 쪽이든next핸들러(함수) 또는 관찰자 객체.

따라서 귀하의 경우 다음을 사용하십시오.

.subscribe({
   next: this.handleUpdateResponse.bind(this),
   error: this.handleError.bind(this)
});

다음 GitHub 문제를 참조하십시오.

어쩌면 흥미로울지도 몰라observer물체는 또한 (여전히) 다음을 포함할 수 있다.complete()메서드 및 기타 추가 속성.예:

.subscribe({
    complete: () => { ... }, // completeHandler
    error: () => { ... },    // errorHandler 
    next: () => { ... },     // nextHandler
    someOtherProperty: 42
});

이렇게 하면 특정 방법을 생략하는 것이 훨씬 쉽다.예전 서명으로 공급할 필요가 있었다.undefined그리고 논쟁의 순서를 고수하라.이제는 예를 들어 다음 완벽한 핸들러만 공급할 때 훨씬 더 명확해졌다.

나에게 있어, 그것은 단지 나의 VSCode가 가리키는 형식적인 버전이었다.

VSCode 상태 표시줄

TypeScript 버전 선택기

로컬 TypeScript 버전 선택

GitHub 코멘트의 도움을 받았어.

나는 이것이 형식적인 문제라고 믿는다.서식의 최신 버전에 있는 무언가가 이 경고를 코드 대 코드로 표시하게 하고 있다.vs 코드의 오른쪽 하단에 있는 typecript 버전을 클릭하고 typecript 버전 선택 옵션을 선택함으로써 나는 그것이 없어지도록 할 수 있었다.우리의 경우 4.0.7인 각도 프로젝트에 설치한 node_modules 버전으로 설정했다.이로 인해 경고는 사라지게 되었다.

객체를 다음과 같이 입력하면 이 오류가 발생할 수 있다.Observable<T> | Observable<T2>- 에 반대되는Observable<T|T2>.

예를 들면 다음과 같다.

    const obs = (new Date().getTime() % 2 == 0) ? of(123) : of('ABC');

컴파일러가 만들지 않음obs활자의Observable<number | string>.

다음과 같은 것이 당신에게 오류를 준다는 것은 놀랄지도 모른다.Use an observer instead of a complete callback그리고Expected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

왜냐하면 그것은 두 가지 다른 유형 중 하나가 될 수 있고 컴파일러가 그들을 조화시킬 만큼 충분히 똑똑하지 않기 때문이다.

반환하려면 코드를 변경해야 함Observable<number | string>대신에Observable<number> | Observable<string>이것의 미묘한 점은 당신이 무엇을 하느냐에 따라 달라질 것이다.

마이그레이션한 경우Angular에서 투영하다.TSLintESLint그리고 그것은 이제 더 이상 경고를 나타내지 않는다!

나는 이러한 단계를 따랐다. (각 단계의 끝도 변경을 수행할 것을 권고한다.)

  1. eslint 추가:ng add @angular-eslint/schematics

  2. tslint를 eslint로 변환:ng g @angular-eslint/schematics:convert-tslint-to-eslint

  3. 제거하다tslint그리고codelyzer:npm uninstall -S tslint codelyzer

  4. 많은 린트 문제를 자동으로 수정하려면ng lint --fix(고정되지 않은 문제도 나열됨)

  5. 에서 VSCode TSLint플러그인, 설치ESLint플러그인과 VSCode를 다시 로드하십시오.

  6. 패키지 및 패키지 잠금 파일이 업데이트되었는지 확인하십시오.또한 프로젝트의 node_modules.

  7. 만약 당신이 그것을 가지고 있다면.tsconfig.json하위 디렉터리 아래의 파일 - 추가/업데이트 필요projects-root-directory/.vscode/settings.json하위 디렉토리와 함께tsconfig파일들은!

    {
      "eslint.workingDirectories": [
        "sub-directory-where-tsconfig-files-are"
      ]
    }
    

나는 구독 신청을 위해 이것을 전달했기 때문에 경고를 받고 있었다.

myObs.subscribe(() => someFunction());

단일 값을 반환하기 때문에 호환이 안 된다.subscribe의 기능 서명

이 상태로 전환하면 경고가 사라진다(null/void 반환).

myObs.subscribe(() => {
  someFunction();
});

너는 tslint를 eslint로 교체해야 한다.

더 사용되지 않기 때문에 TSLintga를 .@deprecatedRXJS의 문 구독을 할 수 있는 ESLint는 올바르게 보풀을 구독하기 위해 사용할 올바른 린터입니다.

자세한 내용은 공식 웹 사이트 https://rxjs.dev/decemptions/subscriptions에서 확인하십시오.

주목하라{}아래 두 번째 구독 코드의 교정기

import { of } from 'rxjs';

// recommended 
of([1,2,3]).subscribe((v) => console.info(v));
// also recommended
of([1,2,3]).subscribe({
    next: (v) => console.log(v),
    error: (e) => console.error(e),
    complete: () => console.info('complete') 
})

참조URL: https://stackoverflow.com/questions/55472124/subscribe-is-deprecated-use-an-observer-instead-of-an-error-callback

반응형