angular7 Rxjs 異步請求


Promise 和 RxJS 處理異步對比

Promise 處理異步:

let promise = new Promise(resolve => {
setTimeout(() => {
resolve('---promise timeout---');
}, 2000);
});
promise.then(value => console.log(value));

 RxJS 處理異步

import {Observable} from 'rxjs';
let stream = new Observable(observer => {
setTimeout(() => {
observer.next('observable timeout');
}, 2000);
});
stream.subscribe(value => console.log(value));

 

 從上面列子可以看到 RxJS 和 Promise 的基本用法非常類似,除了一些關鍵詞不同。Promise 里面用的是 then() 和 resolve(),而 RxJS 里面用的是 next() 和 subscribe()。從上面例子我們感覺Promise 和 RxJS 的用法基本相似。其實Rxjs相比Promise 要強大很多。 比如 Rxjs 中可以中途撤回、Rxjs 可以發射多個值、Rxjs 提供了多種工具函數等等。

Rxjs unsubscribe 取消訂閱

Promise 的創建之后,動作是無法撤回的。Observable 不一樣,動作可以通過 unsbscribe() 方 法中途撤回,而且 Observable 在內部做了智能的處理。

Promise 創建之后動作無法撤回

 

let promise = new Promise(resolve => {
setTimeout(() => {
resolve('---promise timeout---');
}, 2000);
});
promise.then(value => console.log(value));

Rxjs 可以通過 unsubscribe() 可以撤回 subscribe 的動作

let stream = new Observable(observer => {
let timeout = setTimeout(() => {
clearTimeout(timeout);
observer.next('observable timeout');
}, 2000);
});
let disposable = stream.subscribe(value => console.log(value));
setTimeout(() => {
//取消執行
disposable.unsubscribe();
}, 1000);

 Rxjs 訂閱后多次執行

 如果我們想讓異步里面的方法多次執行,比如下面代碼。

這一點 Promise 是做不到的,對於 Promise 來說,最終結果要么 resole(兌現)、要么 reject (拒絕),而且都只能觸發一次。如果在同一個 Promise 對象上多次調用 resolve 方法, 則會拋異常。而 Observable 不一樣,它可以不斷地觸發下一個值,就像 next() 這個方法的 名字所暗示的那樣。

let promise = new Promise(resolve => {
setInterval(() => {
resolve('---promise setInterval---');
}, 2000);
});
promise.then(value => console.log(value));

 

 Rxjs

et stream = new Observable<number>(observer => {
let count = 0;
setInterval(() => {
observer.next(count++);
}, 1000);
});
stream.subscribe(value => console.log("Observable>"+value));

 Angualr6.x 之前使用 Rxjs 的工具函數 map filter

 注意:Angular6 以后使用以前的 rxjs 方法,必須安裝 rxjs-compat 模塊才可以使用 map、filter 方法。

angular6 后官方使用的是 RXJS6 的新特性,所以官方給出了一個可以暫時延緩我們不需要修 改 rsjx 代碼的辦法。

npm install rxjs-compat

  

et stream= new Observable<any>(observer => {
let count = 0;
setInterval(() => {
observer.next(count++);
}, 1000);
});
stream.filter(val=>val%2==0)
.subscribe(value => console.log("filter>"+value));
stream
.map(value => {
return value * value
})
.subscribe(value => console.log("map>"+value));

 Angualr6.x 以后 Rxjs6.x 的變化以及 使用

 Rxjs 的變化參考文檔:http://bbs.itying.com/topic/5bfce189b110d80f905ae545

RXJS6 改變了包的結構,主要變化在 import 方式和 operator 上面以及使用 pipe()

 

import {Observable} from 'rxjs';
import {map,filter} from 'rxjs/operators';

 

let stream= new Observable<any>(observer => {
let count = 0;
setInterval(() => {
observer.next(count++);
}, 1000);
});
stream.pipe(
filter(val=>val%2==0)
)
.subscribe(value => console.log("filter>"+value));
stream.pipe(
filter(val=>val%2==0), map(value => {
return value * value
})
)
.subscribe(value => console.log("map>"+value));

 Rxjs 延遲執行

import {Observable,fromEvent} from 'rxjs';
import {map,filter,throttleTime} from 'rxjs/operators';
var button = document.querySelector('button');
fromEvent(button, 'click').pipe(
throttleTime(1000)
)
.subscribe(() => console.log(`Clicked`));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM