实例在 angulardemo06:
//重点:Rxjs获取异步方法的数据,可以中途撤回,可以多次订阅,可以用工具处理返回的数据
/*
1.在service服务中引入Observable:import { Observable } from ‘rxjs’;
1.1 在app.modules.ts中引入RequestService:import { RequestService } from ‘./services/request.service’;
1.2 在app.modules.ts中配置RequestService:providers: [RequestService],
1.3 在需要获取数据的ts中引入RequestService:import { RequestService } from ‘src/app/services/request.service’;
1.4 在需要获取数据的ts的构造器中获取RequestService对象:constructor(public request:RequestService) {}
2.在service服务中创建异步方法(自定义方法名)getRxjsData(){};
3.在getRxjsData()方法中返回Observable对象,名称自定义,一般为observer;
4.调用observer.next(需要处理的数据)方法发送异步数据
5.在需要获取数据的ts中调用rxjs异步方法:var rxjsData=this.request.getRxjsData();
6.调用该对象的subscribe方法打印即可:rxjsData.subscribe(处理结果);
撤回操作:
1.在需要获取数据的ts中调用rxjs异步方法:var stream=this.request.getRxjsData();
2.调用stream.subscribe(处理结果)方法并将返回值赋给新值(自定义名称)d;
3.调用d.unsubscribe()方法即可取消订阅
多次订阅:
1.可在service服务中的异步方法(自定义方法名)getRxjsIntervalData()中设置定时器(间隔几秒再次调用);
2.方法中返回Observable对象,名称自定义,一般为observer;
3.调用observer.next(需要处理的数据)方法发送异步数据;
4.在需要获取数据的ts中调用rxjs异步方法:var streamInterval=this.request.getRxjsIntervalData();
5.调用该对象的subscribe方法打印即可:streamInterval.subscribe(处理结果);
*/
//Rxjs處理異步,延时触发一次
getRxjsData(){
return new Observable((observer)=>{
setTimeout(()=>{
var username='张三--Rxjs'
observer.next(username);
//observer.error('失败');//失败返回error,可选
},3000);
})
}
//Rxjs處理異步,定时触发多次
getRxjsIntervalData(){
let count=0;
return new Observable((observer)=>{
setInterval(()=>{
count++;
var username='张三--Rxjs Interval '+count+'次';
observer.next(username);
//observer.error('失败');//失败返回error,可选
},2000);
})
}
//Rxjs處理異步,用map,filter工具处理
getRxjsIntervalNum(){
let count=0;
return new Observable((observer)=>{
setInterval(()=>{
observer.next(count++);
//observer.error('失败');//失败返回error,可选
},2000);
})
}
//过1s后撤回刚才的操作
var stream=this.request.getRxjsData();
var d=stream.subscribe((data)=>{
console.log(data);
});
setTimeout(()=>{
d.unsubscribe();//取消订阅
},1000);
//Rxjs多次订阅:
var streamInterval=this.request.getRxjsIntervalData();
streamInterval.subscribe((data:any)=>{
console.log(data);
});
//Rxjs用工具(map,filter)处理数据:
var streamNum=this.request.getRxjsIntervalNum();
streamNum.pipe(//管道可以多个工具一起使用,用逗号分隔
filter((value:any)=>{
if(value%2==0){
return true;
}else{
return false;
}
}),
map((value:any)=>{
return value*value;
})
).subscribe((data:any)=>{
console.log(data);
});