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); });