1.回调函数
/* * 1.设计实现函数 */
print_msg(msg) {
console.log(msg);
}
/* * 2.设计调用函数,param1:实现函数参数,param2:实现函数本身 */
async_read(msg, callback) {
callback(msg);
}
constructor() {
/* * 3.调用 调用函数 */
this .async_read( ' 我要打印的消息 ' , this .print_msg);
}
这样做可以通过3给2传入不同的函数名而实现不同的操作。
2.Promise
study_promise() {
const p = new Promise(resolve => {
resolve( ' 成功回调 ' );
}).then((res) => {
console.log(res);
return res;
}).then((res) => {
console.log(res);
});
}
3.Observable
?
3.1先写一个简单的例子,5s内每隔一秒打印一次‘hello’
constructor() {
this .study_observable()
.subscribe((res) => {
console.log(res);
});
}
study_observable(): Observable < string > {
let i = 0 ;
return Observable.create((observer) => {
setInterval(() => {
i ++ ;
observer.next( ' hello_ ' + i);
if (i === 5 ) {
observer测试数据plete();
}
}, 1000 );
});
}
3.2 of创建Observable 并订阅一个Observer
ngOnInit() {
this .getdata();
}
getdata() {
const myObservable = of( 1 , 2 , 3 );
const myObserver = {
next: x => console.log( ' next ' + x),
error: err => console.error( ' error ' + err),
complete: () => console.log( ' complete ' )
};
myObservable.subscribe(myObserver);
}
? of创建一个可观察对象,上面的代码等价于
ngOnInit() {
this .getdata();
}
getdata() {
// const myObservable = of(1, 2, 3);
const myObservable = new Observable( this .sequenceSubscriber);
const myObserver = {
next: x => console.log( ' next ' + x),
error: err => console.error( ' error ' + err),
complete: () => console.log( ' complete ' )
};
myObservable.subscribe(myObserver);
}
sequenceSubscriber(observer: Observer <any> ) {
observer.next( 1 );
observer.next( 2 );
observer.next( 3 );
observer测试数据plete();
return { unsubscribe() { } };
}
3.3 页面 Async 管道
<div>{{time$ | async }}</div>
这样写就相当于订阅了time$,会实时接收next过来的值,
Observable定义如下,用来逐秒打印时间,
页面接收的值类型为Observable<T>,下方为string
time$: Observable< string > ;
ngOnInit() {
this .time$ = new Observable(observer => {
setInterval(() => {
observer.next( new Date().toString());
}, 1000 );
});
}
若是要接收object对象,需要这样取值
<ng-container *ngIf= " time$ | async as time " >
<div>
{{time.date}}
{{time.time}}
</div>
</ng-container>
ts:
time$: Observable< object > ;
ngOnInit() {
this .time$ = new Observable(observer => {
setInterval(() => {
const e = new Date();
observer.next({ date: e.toDateString(), time: e.toTimeString() });
}, 1000 );
});
}
?3.4 Object
既可以作为Observable、也可以作为Observer
支持多播
constructor() {
const subject = new Subject();
/* 作为被观察者 支持多播 可以订阅多个观察者 */
subject.subscribe(
{
next: x => console.log( ' A: ' + x)
}
);
subject.subscribe(
{
next: x => console.log( ' B: ' + x)
}
);
/* 发送值 */
subject.next( 1 );
subject.next( 2 );
/* Subject作为观察者,可以被Observalbe订阅 */
const fo = of( 1 , 2 , 3 );
fo.subscribe(subject);
}
结果:
?3.5? ?BehaviorSubject 是 Subject的子类?
它有一个“当前值”的概念,保存了发送给消费者的最新值。
并且当有新的观察者订阅时,会立即从? BehaviorSubject ?那接收到“当前值”。
constructor() {
const bs = new BehaviorSubject( 0 ); // 给一个当前值(初始值)
bs.subscribe({
next: v => console.log( ' A ' + v),
});
bs.next( 1 );
bs.subscribe({
next: v => console.log( ' B ' + v)
});
bs.next( 2 );
}
结果:
?3.6??ReplaySubject? 是Subject的子类
发送旧值给新的订阅者
constructor() {
const bs = new ReplaySubject( 3 ); // 回放三个值
bs.subscribe({
next: v => console.log( ' A ' + v),
});
bs.next( 1 );
bs.next( 2 );
bs.next( 3 );
bs.next( 4 );
bs.subscribe({
next: v => console.log( ' B ' + v)
});
bs.next( 5 );
}
结果:
?3.7??AsyncSubject? 是Subject的子类
只有当 Observable 执行完成时(执行? complete() ),它才会将执行的最后一个值发送给观察者。
constructor() {
const bs = new AsyncSubject();
bs.subscribe({
next: v => console.log( ' A ' + v),
});
bs.next( 1 );
bs.next( 2 );
bs.next( 3 );
bs.next( 4 );
bs.subscribe({
next: v => console.log( ' B ' + v)
});
bs测试数据plete();
bs.next( 5 );
}
结果:
?
查看更多关于angular Observable的详细内容...