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就完成了,没有错误. 如果您想知道您无法找到容器,处理错误可能是件好事. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |