当前位置: 首页 > Web前端 > HTML

SAP电商云UIActiveCartService的isStableAPI中EMPTY操作符

时间:2023-03-27 23:49:36 HTML

isStableAPI源码如下:returnthis.activeCartId$.pipe(switchMap((cartId)=>this.multiCartService.isStable(cartId)),debounce((state)=>(state?timer(0):EMPTY)),distinctUntilChanged());EMPTY运算符:直接发送完成事件。看一个简单的例子:import{EMPTY}from'rxjs';EMPTY.subscribe({next:()=>console.log('Next'),complete:()=>console.log('Complete!'),});//输出//Complete!console.log('fire');EMPTY.subscribe((value)=>console.log('value:',value));我们永远不会在控制台中看到PrintingtoNext或value,因为EMPTY不会发出任何数据,只会发出完整的事件。这里引入debounce是为了避免spinner闪烁。当数据加载速度非常快时,如果用户只看到几分之一秒的微调动画闪烁,但是,这是非常糟糕的用户体验。避免这种用户交互问题的方法之一是引入非闪烁加载器(Non-flickerloader)。这个加载器需要满足要求:如果加载时间小于1秒——我们根本不会显示加载器;如果加载时间超过一秒-我们开始显示加载程序并在屏幕上保持至少1秒。例如,我们的数据加载需要1.2秒。前1秒我们什么都不显示,1秒后出现加载程序。再过0.2秒后,我们接收到数据,但我们将微调器在屏幕上再保持0.8秒,因此微调器不会闪烁。实际代码:readonlyload$=newSubject();readonlycancel$=newSubject();readonlydata$=this.load$.pipe(switchMapTo(nonFlickerLoader(this.dataService.load())),map(value=>value??'Loading...'),startWith('Nodata'),takeUntil(this.cancel$),repeat(),);这里我们有两个触发主题开始和取消加载。假设我们的nonFlickerLoader在它应该指示加载时发出null,并在我们应该显示它时发出实际加载的数据。我们使用重复运算符,所以我们可以多次触发它。现在让我们继续编写nonFlickerLoader函数。首先我们定义接口。我们使用generic因为我们不知道我们将得到的响应类型:functionnonFlickerLoader(data$:Observable,delay:number=1000,duration:number=1000):Observable<吨|null>{//...}此函数接受一个数据Observable和两个可选参数,以指示我们在显示加载指示器之前等待多长时间以及应显示微调器的最短持续时间。函数的具体实现代码,首先创建一个加载Observable:constloading$=timer(delay,duration).pipe(map(i=>!i),takeWhile(Boolean,true),startWith(false),)这个$loading是一个标志,告诉我们是否应该显示微调器。map将除第一个emit值之外的所有值都转换为false。takeWhile只允许第一个emit值通过。map将除第一个之外的所有发射设置为false。takeWhile用于仅在延迟期满后让第一次触发,并在持续时间结束后触发第二次触发。注意,我们使用第二个参数让布尔条件的假值在完成流之前无法通过。我们也startWith(false)因为我们只想在给定的延迟后显示加载指示器。注意timer的第二个参数://RxJSv6+import{timer}from'rxjs';/*timer有第二个参数,多久发射一次后续值在这种情况下我们将在1秒后发射第一个值和后续在*/constsource=timer(1000,2000);//output:0,1,2,3,4,5......constsubscribe=source.subscribe(val=>console.日志(val));下面代码的意思是1秒后发出整数1,然后每2秒发出一个递增的整数序列。