Angular 4.3 Observables:如何重试间隔和最大重试次数?
发布时间:2020-12-17 17:29:26 所属栏目:安全 来源:网络整理
导读:我是Angular 4.3的新手.我有一个地图应用程序,通过下载一系列小图像(“图块”)呈现“地图图层”.在启动时,地图图层可能需要0.1到5.0秒才能下载. 当客户端收到两个或多个磁贴时,我需要触发一个事件.我原本以为我可以通过订阅一个Observable来实现这个目标,它
|
我是Angular 4.3的新手.我有一个地图应用程序,通过下载一系列小图像(“图块”)呈现“地图图层”.在启动时,地图图层可能需要0.1到5.0秒才能下载.
当客户端收到两个或多个磁贴时,我需要触发一个事件.我原本以为我可以通过订阅一个Observable来实现这个目标,它可以在200ms的间隔内重试30次. 至今: public updateTileContainer() {
this._getTileContainer().subscribe(container => {
if (container) {
console.log('* do stuff with container *');
}
});
}
private _getTileContainer(): Observable<any> {
return Observable.interval(200)
.mergeMap(function (n) {
const tileImages = $('#mymap').find('img[src*='kml']');
console.log(`Retry ${n}: ${tileImages.length} tiles found`);
if (!tileImages || tileImages.length < 2) {
return Observable.of(null);
}
const tileContainer = getContainer(tileImages);
return Observable.of(tileContainer);
})
.take(30);
}
这有效!有点.我得到这个输出: Retry 0: 0 tiles found Retry 1: 0 tiles found Retry 2: 0 tiles found Retry 3: 0 tiles found Retry 4: 0 tiles found Retry 5: 0 tiles found Retry 6: 0 tiles found Retry 7: 2 tiles found * do stuff with container * Retry 8: 3 tiles found * do stuff with container * Retry 9: 9 tiles found * do stuff with container * Retry 10: 12 tiles found * do stuff with container * etc. 我实际上要做的是在“重试7”中发出单个事件,然后停止发射. 如何在找到容器后立即将其更改为“完成”Observable?我怎样才能“跳过”重试0到6的事件,因为它们不是真正的事件?如果在没有找到容器的情况下进行30次重试,我可以从Observable中抛出一个错误吗? 解决方法
使用.retry(count)
如果您选择的内容少于2个,则可以抛出错误.然后重试()30次. 注意:在第30次重试之后,实际会发出错误并且您需要处理它.但这可能是一件好事(见进一步). public updateTileContainer() {
this._getTileContainer().subscribe(container => {
console.log('* do stuff with container *');
},error=>{
console.log('no container found !');
});
}
private _getTileContainer(): Observable <any> {
return Observable.timer(200).map(()=>{
const tileImages = $('#googlemap').find('img[src*='kml']');
if (tileImages.length <= 2)
throw new Error("not enough tiles !");
return getContainer(tileImages);
})
.retry(30);
}
您的解决方案和@JonSt?dle的工作正常.但请注意,如果您无法获得任何容器,则不会收到通知.实际上,如果找不到容器,Observable就完成了,没有错误. 如果您想知道您无法找到容器,处理错误可能是件好事. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
