EmptyError: 순서에 요소가 없습니다.
Angular2 앱을 2.0.0에서 2.3.0으로 업그레이드하는 중에 다음 오류가 발생했습니다.왜 그런지에 대한 아이디어가 있습니까?다른 게시물(Angular 2.0.1 Router Empty Error: no elements in sequence)을 보았지만, 이를 시도한 후에도 여전히 문제가 남아 있습니다.이 오류의 원인은 무엇입니까?
Error: Uncaught (in promise): EmptyError: no elements in sequence
Error: no elements in sequence
at EmptyError.ZoneAwareError (zone.js:672)
at new EmptyError (EmptyError.ts:13)
at FirstSubscriber._complete (first.ts:161)
at FirstSubscriber.Subscriber.complete (Subscriber.ts:122)
at Subject._subscribe (Subject.ts:109)
at Subject.Observable.subscribe (Observable.ts:98)
at Observable._subscribe (Observable.ts:158)
at Observable.subscribe (Observable.ts:98)
at Observable._subscribe (Observable.ts:158)
at FirstOperator.call (first.ts:82)
at Observable.subscribe (Observable.ts:96)
at Object.subscribeToResult (subscribeToResult.ts:32)
at MergeAllSubscriber._next (mergeAll.ts:82)
at MergeAllSubscriber.Subscriber.next (Subscriber.ts:95)
at MapSubscriber._next (map.ts:80)
at resolvePromise (zone.js:475) [angular]
at resolvePromise (zone.js:460) [angular]
at /libs/zone.js/dist/zone.js:509:17 [angular]
at Object.onInvokeTask (core.umd.min.js:32) [angular]
at ZoneDelegate.invokeTask (zone.js:261) [angular]
at Zone.runTask (zone.js:151) [<root> => angular]
at drainMicroTaskQueue (zone.js:405) [<root>]
at ZoneTask.invoke (zone.js:336) [<root>]ErrorHandler.handleError @ core.umd.min.js:31next @ core.umd.min.js:32generatorOrNext.object.schedulerFn @ core.umd.min.js:32SafeSubscriber.__tryOrUnsub @ Subscriber.ts:238SafeSubscriber.next @ Subscriber.ts:190Subscriber._next @ Subscriber.ts:135Subscriber.next @ Subscriber.ts:95Subject.next @ Subject.ts:61EventEmitter.emit @ core.umd.min.js:32NgZone.triggerError @ core.umd.min.js:32onHandleError @ core.umd.min.js:32ZoneDelegate.handleError @ zone.js:233Zone.runGuarded @ zone.js:129_loop_1 @ zone.js:416drainMicroTaskQueue @ zone.js:425ZoneTask.invoke @ zone.js:336
또한 가드를 사용하는 경로로 변경하려고 하면 NavigationError 개체가 느려집니다.그러나 위의 오류만 콘솔에 표시됩니다.
NavigationError {id: 2, url: "/home", error: EmptyError}
저는 막막해서 도움을 주시면 감사하겠습니다.
제 경우에는 사용할 때 이러한 오류가 발생했습니다.first()
순식간에Observable
그것을 가지고 있었습니다.takeUntil()
된 앞에서 first()
.
예:
let test$ = new ReplaySubject(1);
let testAux$ = new ReplaySubject(1);
let test2$ = test$.asObservable().takeUntil(testAux$.asObservable());
test2$.first().subscribe(() => console.log('first!'));
testAux$.next(null);
반품을 했기 때문에 문제를 발견하기가 어려웠습니다.observable
와 함께takeUntil()
(다른에서 (으)로 표시되는) 되었습니다.first()
가 발생했습니다(왜냐하면 페이지 탐색 중에 오류가 발생했기 때문입니다).takeUntil()
을 .observable
이전 페이지가 파괴되었을 때 방출됨), 그리고 그것은 내비게이션 자체에 문제가 있는 것처럼 보였습니다.
가장 이상한 것은 오류가 발생한다는 것입니다.next()
호되며인의 두 되지 않습니다.subscribe()
탐색 프로세스 자체가 실패하도록 합니다.이 기능이 rxjs 팀에서 이러한 방식으로 작동하도록 선택한 것인지 모르겠습니다. 왜냐하면 문제를 격리하는 것이 훨씬 더 어렵고, 주요 문제는 생산자가 소비자에 의해 수행된 무언가로 인해 오류를 수신하기 때문입니다. 이는 제게 좋지 않은 디자인으로 보입니다.
.first()는 정확히 하나의 항목을 내보내거나 오류를 던집니다[...] 관찰 가능한 항목에서 최대 하나의 항목을 가져오려면 .take(1)를 사용합니다.
업데이트 (2020-08-31)
다음과 같은 경우처럼 구독에 오류를 수신하는 두 번째 인수를 포함하여 오류를 실제로 처리할 수 있을 것으로 보입니다.
const test$ = new ReplaySubject(1);
const testAux$ = new ReplaySubject(1);
const test2$ = test$.asObservable().takeUntil(testAux$.asObservable());
test2$.first().subscribe(() => console.log('first!'), () => console.log('first error'));
testAux$.subscribe(() => console.log('another'), () => console.log('another error'));
console.log('1');
testAux$.next(null);
console.log('2');
해당 로그:
1
first error
another
2
(이우경당볼수것없입다니을은신▁(이▁the니▁(입')가 것입니다.No elements in sequence
으)로 표시됨)
하지만 당신이 최대 1개의 아이템을 받고 싶다면(하지만 하나도 받지 않아도 괜찮을 것이다),take(1)
여전히 더 나은 접근법일 것이고, 그것은 내가 기본적으로 권장하는 것입니다.first()
.
는 RxJS 을 Angular 4와 할 때 하므로 RxJS RxJS 3을 추가하여 RxJS 5.5.합니다."rxjs": "^5.5.4"
당신의 프로젝트 패키지에.json.
RxJS 5.5.4가 출시되기 전에 다음과 같이 대답했습니다. (이전 버전, 이렇게 하지 마십시오.)
이것은 곧 패치되어야 할 RxJS 문제인 것 같습니다. source.
변경이 필요한 항목:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean>{
return new Observable<boolean>(resolve => {
resolve.next(true);
resolve.complete();
});
}
================
왜 그런지는 모르겠지만 이 오류는 관찰 가능한 항목을 사용하여 라우터 가드를 활성화할 수 있기 때문에 발생했습니다.그러나 약속으로 이동하는 것은 문제를 해결했습니다.
나는 여기서 옮겼습니다.
canActivate(route: ActivatedRouteSnapshot): Observable<boolean>{
return new Observable<boolean>(resolve => {
resolve.complete(true);
//or
resolve.complete(false);
});
}
대상:
canActivate(route: ActivatedRouteSnapshot){
return true;
//or
return false;
});
}
a this.http.get() 이후에 .first()를 수행하고 있었기 때문에 동일한 문제가 있었습니다. Http.get은 콜드 관찰 항목을 반환하므로 콜드 관찰 항목 자체를 자동으로 등록 취소하기 때문에 먼저 필요하지 않았습니다.
this.http.get().pipe(first()); -> EmptyError: 순서에 요소가 없습니다.
오류 메시지 때문에 여기에 온 모든 사람에게, 우리가 void Observable을 반환했기 때문에 이러한 일이 발생했습니다.적어도 "true"와 같은 값을 반환해야 합니다.
return of(true);
이 속성을 경로에 추가합니다.
pathMatch: 'full
예를 들면
{ pathMatch: 'full', path: "", component: HomeComponent }
그것은 나에게 효과가 있었다.
나는 또한 RxJS 6.5.3에서 이 오류에 대한 나의 경험을 공유할 것입니다.last()
이 는 다음과 같은될 수 있습니다.
.pipe(
last(null, []) // predicate = null, defaultValue = []
)
저는 Angular 6 / RxJs 6에서 이 문제를 겪었고 그것이 바로 뒤에 리디렉션되고 완료된 가드 때문이라는 것을 발견했습니다.
이전:
if (!res) {
this.router.navigate(['/']);
observer.complete(); // <-- This was the offender
}
이후:
if (!res) {
this.router.navigate(['/']);
}
저의 경우, rxjs 버전 5.5.12를 사용하여 CanActivate 시나리오에서 문제가 발생했습니다.하지만 결국 해결책은 매우 쉬웠습니다.코드를 변경했습니다.
const guard: Subject<boolean> = new Subject<boolean>();
로.
const guard: ReplaySubject<boolean> = new ReplaySubject<boolean>(1);
부르기
guard.next(...);
guard.complete();
나중에. 그것이 요령을 부렸습니다.그래서 제 시나리오에서는 먼저도 약속도 필요하지 않습니다.
당신은 응답 대신 전체 응답을 반환해야 합니다.몸
이 페이지는 이 오류에 대한 첫 번째 Google 결과이므로 아래는 근본적인 문제를 보다 일반적으로 보여주는 또 다른 패턴입니다.
관측 가능한 연산자와 rxjs 연산자에 매우 익숙해진 후, 약속 기반 접근법으로 돌아가서 머리를 긁적였습니다.
await lastValueFrom(myConfirmation().pipe(
filter(confirmation => !!confirmation),
switchMap(() => myOperation())))
.then(response => console.log(response))
.catch((error) => console.log(error));
한다면confirmation
거짓으로 됩니다.then
할 수 블에도못했니다습지하달록▁block▁an다입니다. 약속을 완료할 수 없습니다.EmptyError: no elements in sequence
오류가 발생했습니다.
이 경우의 해결책은 다음을 제거하는 것입니다.filter
그래서then
블록에 도달한 경우에도confirmation
거짓으로 평가됩니다.
await lastValueFrom(myConfirmation().pipe(
switchMap((confirmation) => {
if (confirmation) {
return myOperation();
} else {
return of(false)
}
})))
.then(response => {
if (response) {
console.log(response);
} else {
console.log('Operation was not confirmed');
}
})
.catch((error) => console.log(error))
Angular의 라우터 때문에 이 오류가 발생했습니다.expandSegment
RXJS를 사용하는 함수first
교환입니다.
그것은 발생했습니다.canDeactivate
구성 요소에 대한 핸들러가 잘못 처리되었으며 이미 완전한 관찰 가능 항목(대화 상자에 대해)을 반환하고 있었습니다. 이로 인해 라우터가 아무것도 출력되지 않고 완료되어 오류가 발생했습니다.first
.
저를 위한 해결책은 변수에서 관찰 가능한 오래된 대화상자를 지우는 코드 라인을 이동하는 것이었습니다.tap
(않음)에서 (으)로 이동합니다.finalize
연산자, 항상 실행됩니다.
저의 특별한 상황은 사용자가 페이지에 저장하지 않은 변경사항이 있는지 확인하고 페이지를 폐기할지 또는 유지할지 묻는 캔을 비활성화하는 것이었습니다.것을 후속 ▁subsequ▁that▁observ▁if▁pass▁it▁dialog▁wasit▁and,▁discarded▁to▁those▁can기▁they▁then▁app▁changes있수앱▁the다ent전▁(▁of다▁pick▁weird(니록록합▁and도할▁the후▁incanDeactivate
다중 상자 안 함은 실행됩니다.canDeactivate
즉시 완료되고 오류가 발생합니다.
위의 어떤 것도 그것에 효과가 없었습니다.이것이 저에게 효과가 있었습니다.경로 정의:
{ path: '', component: WelcomeComponent, pathMatch: 'full' },
언급URL : https://stackoverflow.com/questions/41131476/emptyerror-no-elements-in-sequence
'it-source' 카테고리의 다른 글
jQuery를 사용하여 형제 요소를 선택하려면 어떻게 해야 합니까? (0) | 2023.08.24 |
---|---|
jQuery 위치 href (0) | 2023.08.24 |
jQuery를 통한 Gmail like 파일 업로드 (0) | 2023.08.24 |
HTML 또는 Javascript에서 PHP 파일을 호출하는 방법 (0) | 2023.08.24 |
powershell 아직 할당되지 않은 변수 테스트 (0) | 2023.08.24 |