1.回调函数promise
getName() { return '张三'; } getAsyncName() { setTimeout(() => { return 'async_张三'; }, 1000); }
这是咱们定义好的两个函数,当调用这两个函数的时候,由于setTimeout是异步的,因此并不能正常返回值,补全返回类型可使咱们更加直观的看出效果。异步
getName(): string getAsyncName(): void
这时候,要获取返回值,就须要使用回调函数,将getAsyncName()修改为async
getAsyncName(back) { setTimeout(() => { back('async_张三'); }, 1000); }
调用函数
this.getAsyncName((data) => { console.log(data); });
成功输出:async_张三
2.Promise处理异步工具
getPromiseData() { return new Promise((success, error) => { setTimeout(() => { success('promise_张三'); }, 1000); }); }
ps:error为失败回调函数,能够不写
调用this
this.getPromiseData().then((data) => { console.log(data); });
3.Observable(集成在rxjs模块)spa
import { Observable } from 'rxjs';
getObservableData() { return new Observable((obserber) => { setTimeout(() => { obserber.next('rxjs_张三'); }, 1000); }); }
ps:失败回调为obserber.error('失败');
调用code
this.getObservableData().subscribe((data) => { console.log(data); });
可见Promise和Observable很是类似blog
(Observable强大一点,能够取消订阅、循环监听、提供多种工具函数)rxjs
a.取消订阅
const d = this.getObservableData().subscribe((data) => { console.log(data); }); d.unsubscribe(); // 取消订阅
因为getObservableData方法是一秒后执行的,程序得到返回值以前执行了取消订阅,因此这里将不打印出结果
b.循环监听
先写一个异步循环函数,每隔一秒返回一个值
getObservable_Interval_Data() { let i = 1; return new Observable((obserber) => { setInterval(() => { i++; obserber.next('rxjs_张三_Interval_' + i); }, 1000); }); }
调用
this.getObservable_Interval_Data().subscribe((data) => { console.log(data); });
结果:每隔一秒打印一个值
c.工具函数(pip管道,filter过滤器,map操做)
咱们先写一个方法,从1开始递增打印
getObservable_Num_Data() { let i = 0; return new Observable((obserber) => { setInterval(() => { i++; obserber.next(i); }, 1000); }); }
调用
this.getObservable_Num_Data().subscribe((data) => { console.log(data); });
好,这很容易,前面也提到过了,可是如今咱们不改变本来的函数,可是只要打印偶数呢(对值进行筛选)
import { filter } from 'rxjs/operators';
修改函数以下:
this.getObservable_Num_Data() .pipe( filter((value: number) => { if (value % 2 === 0) { return true; } }) ) .subscribe((data) => { console.log(data); });
如今咱们要打印值的二次幂呢(对值进行操做)
import { map } from 'rxjs/operators';
修改函数以下:
this.getObservable_Num_Data() .pipe( map((value: number) => { return value * value; }) ) .subscribe((data) => { console.log(data); });
还有,就是补充一点,pipe管道能够对值进行屡次操做,用逗号隔开,执行顺序从上到下
如:
this.getObservable_Num_Data() .pipe( filter((value: number) => { if (value % 2 === 0) { return true; } }), map((value: number) => { return value * value; }), map((value: number) => { return value * 2; }) ) .subscribe((data) => { console.log(data); });