如何在 rxjs 中创建一个模拟 API 调用,它会在 1 秒后抛出错误?
How do I create a simulated API call in rxjs that throws an error after 1 second?
在这里玩代码 => https://stackblitz.com/edit/playground-rxjs-f8xjsh
嗨,
我正在尝试模拟失败的 API 调用,它将在 subscribe() { Error: } 部分发出错误值。
import { from, of, pipe, forkJoin, interval, AsyncSubject, BehaviorSubject,defer, Subject, timer, observable, throwError } from 'rxjs';
import { concatMap, map, mergeMap, zipWith, delay, tap, concatAll, concat, concatWith, switchMap, catchError } from 'rxjs/operators';
const apiCall = (callNumber, isError=false) => of('Api Call Result ' + callNumber).pipe(
tap(_=>console.log('Calling Api ' + callNumber)),
delay(1000),
tap(_=> throwError(() => new Error('ERROR')))
);
apiCall(99,true).subscribe({
next: x=>console.log(x),
error: e=>console.log(e)
});
目前错误未被捕获,即被记录。
有人可以帮忙吗?
Stackblitz => https://stackblitz.com/edit/playground-rxjs-f8xjsh
tap
执行该函数,然后发出它接收到的任何内容,不变。
throwError
是一个 return 可观察的函数。
因此,如果 x
是
,someObservable.pipe(x)
将 return 发出错误的可观察对象
map(() => { throw new Error('msg') })
,或
switchMap(() => throwError('msg'))
...或者您可以简单地使用 throwError('msg'))
创建一个新的可观察对象,而无需通过管道传输任何内容...
但是 tap(() =>
任何东西)
都不会改变 observable 发出的东西。
这是一个工作示例,灵感来自 @JSmart523
const apiCall = (callNumber: number, isError = false) =>
of('Api Call Result ' + callNumber).pipe(
tap((_) => console.log('some log before')),
delay(1000),
switchMap((_) => {
if (isError) {
throw new Error(`ERROR`);
} else {
return of(_);
}
})
);
apiCall(99, true).subscribe({
next: (x) => console.log(x),
error: (e: Error) => console.log(e.message),
});
在这里玩代码 => https://stackblitz.com/edit/playground-rxjs-f8xjsh
嗨, 我正在尝试模拟失败的 API 调用,它将在 subscribe() { Error: } 部分发出错误值。
import { from, of, pipe, forkJoin, interval, AsyncSubject, BehaviorSubject,defer, Subject, timer, observable, throwError } from 'rxjs';
import { concatMap, map, mergeMap, zipWith, delay, tap, concatAll, concat, concatWith, switchMap, catchError } from 'rxjs/operators';
const apiCall = (callNumber, isError=false) => of('Api Call Result ' + callNumber).pipe(
tap(_=>console.log('Calling Api ' + callNumber)),
delay(1000),
tap(_=> throwError(() => new Error('ERROR')))
);
apiCall(99,true).subscribe({
next: x=>console.log(x),
error: e=>console.log(e)
});
目前错误未被捕获,即被记录。 有人可以帮忙吗?
Stackblitz => https://stackblitz.com/edit/playground-rxjs-f8xjsh
tap
执行该函数,然后发出它接收到的任何内容,不变。
throwError
是一个 return 可观察的函数。
因此,如果 x
是
someObservable.pipe(x)
将 return 发出错误的可观察对象
map(() => { throw new Error('msg') })
,或switchMap(() => throwError('msg'))
...或者您可以简单地使用 throwError('msg'))
创建一个新的可观察对象,而无需通过管道传输任何内容...
但是 tap(() =>
任何东西)
都不会改变 observable 发出的东西。
这是一个工作示例,灵感来自 @JSmart523
const apiCall = (callNumber: number, isError = false) =>
of('Api Call Result ' + callNumber).pipe(
tap((_) => console.log('some log before')),
delay(1000),
switchMap((_) => {
if (isError) {
throw new Error(`ERROR`);
} else {
return of(_);
}
})
);
apiCall(99, true).subscribe({
next: (x) => console.log(x),
error: (e: Error) => console.log(e.message),
});