sei*_*zej 6 javascript rxjs reactivex rxjs5
我正在尝试重复请求,直到响应使用RxJS包含数据为止,这时我想调用成功(或失败)处理程序,但是我在使用RxJS时遇到了麻烦。这是我目前的方法:
// ... redux-observable action observable
.mergeMap(() =>
fetchData()
.repeatWhen(response =>
response.takeWhile(({ data }) => !data.length)
.of(response)
)
)
.map(successFunction)
.catch(failureFunction);
Run Code Online (Sandbox Code Playgroud)
免责声明:我是RxJS的新手。
听起来您想抑制 ajax 结果并重试,直到得到您想要的响应。我会这样做:
// observable that will re-fetch each time it is subscribed
const request = Observable.defer(() => fetchData());
// each time request produces its value, check the value
// and if it is not what you want, return the request
// observable, else return an observable with the response
// use switchMap() to then subscribe to the returned
// observable.
const requestWithRetry = request.switchMap(r =>
r.data.length ? Observable.of(r) : requestWithRetry);
Run Code Online (Sandbox Code Playgroud)
空数据不是错误,所以首先我们检查数据是否为空,如果是则抛出错误。thenretryWhen可用于测试此错误并在它发生时重试。
.mergeMap(() =>
fetchData()
.map(data => {
if (!data.length) {
throw 'no data';
}
return data;
})
.retryWhen(errors => errors.takeWhile(error => error === 'no data'))
)
.map(successFunction)
.catch(failureFunction);
Run Code Online (Sandbox Code Playgroud)
以间隔重复请求、过滤其结果并进行一次发射更简单。
Observable.timer(0, 500)
.flatMap(() => fetchData())
.filter(r => r.data && r.data.length)
.take(1)
.timeout(10000)
Run Code Online (Sandbox Code Playgroud)
http://jsbin.com/cafericore/1/edit?js,console
| 归档时间: |
|
| 查看次数: |
2818 次 |
| 最近记录: |