~ Những concept trong RxJS xử lý async (bất đồng bộ)
+ Observable: đại diện cho 1 bộ sưu tập dữ liệu or sự kiện trong tương lai
+ Observer: tập hơn các hàm callbacks biết lắng nghe các giá trị được cung cấp bởi obs.
+ Subscription: đại diện cho một thể hiện của observable, hữu ích cho việc hủy việc subscribe obs đó.
+ Operators: là những chức năng nhằm xử lý các bộ sưu tập với operations like map, reduce, filter...
+ Subject: tương tự như EventEmitter, đa dạng hóa giá trị cho nhiều observers
_____RxJS Tutorial
Observable là dạng trả về đồng bộ, Khi thêm delay sẽ về dạng bất đồng bộ
*** Creation Operators
of()
from() -> giống như of() nhưng nó chỉ nhận interable (array, set, map, string, promise) - là những thằng có thể lặp được.
interval()
timer()
defer() -> mỗi lần subcribe nó thì nó lại trả về 1 giá trị
*** Pipeable Operators(ôn lại 1 chút) thông qua thằng pipe
map -> Giống như thằng array.map, thay đổi giá trị của 1 mảng,
fluck -> Lấy giá trị thông qua thằng propertype
mapto -> Khi 1 sự kiện xảy ra thì kết quả trả về là 1 giá trị nào đó.
toArray -> Trả về 1 mảng chưa tất cả những stream và chỉ chạy khi tất cả stream đã được complete
reduce -> giống như reduce của array, nhưng nó chỉ chạy khi tất cả stream đã được complete
***Combination Operators (Kết hợp nhiều stream thành 1 stream)
forkJoin -> Gộp các steam chạy đồng thời, và emit lại giá trị khi tất cả complete, nếu 1 stream bị lỗi thì nó sẽ ko emit, hoặc 1 stream ko complete thì forkJoin không emit giá trị nào cả (nghĩa là nó forkJoin sẽ ko completed).
combineLatest -> Khi 1 stream emit giá trị thì lúc đó nó sẽ lấy giá trị cuối cùng của stream đó và tất cả giá trị cũ của steam còn lại, ban đầu sẽ đợi all stream emit ít nhất 1 lần, sau đó sẽ tính toán những lần emit của các stream (mỗi lần emit là 1 lần trả về result) -> Khi tất cả đã từng 1 lần emit thì lần sau chỉ cần 1 thằng complete thì nó sẽ trả về, kể cả khi thằng kia chưa complete thì nó sẽ lấy giá trị cũ
→ Sẽ completed khi all stream bên trong completed
+ TH mà trong combineLatest có 1 stream ko emit gì, sẽ ko chạy
~ TH lúc đầu ko run vì đợi all complete 1 lần, do dùng this.searchInput.valueChanges -> start sẽ ko run
merge() -> Cho phép các stream chạy đồng thời, thằng nào complete thì nó log
concat() -> tại 1 thời điểm chỉ cho phép 1 thằng stream chạy, chạy xong từng steam nó sẽ emit dữ liệu
zip() -> gán Theo cặp, khi chạy thì nó sẽ ghép dữ liệu theo cặp, khi 1 stream chưa emit thì nó sẽ đợi
race(obs1, obs2).sub... → Chỉ emit và subscibe vào 1 trong 2, cái nào emit trc thì nó sẽ subscribe vào
*** debounceTime(time) | timer(time), delay(time)
+ debounceTime: trì hoãn giá trị emitted (phát ra) trong 1 time nhất định, nếu nguồn phát ra 1 giá trị mới, thì value cũ sẽ bị loại bỏ, time được đặt lại. -> giá trị trong 1 thời gian nhất định sẽ là mới nhất
+ timer (2 type)
-> Tạo an observable được đợi sau 1 khoảng time trước khi nó tạo ra số 0 ~ tạo ra độ trễ sau 1 time.
-> initialDelay::
Syntax ~ timer(due, scheduler)
-> due ~ Là khoảng time độ trễ tra khi emit | scheduler ~ Default is underfined. The scheduler to use to schedule the delay, default to
Mỗi khi 1 observable trả về 1 obs thì t có cách sử dụng bên dưới.
Khi Subscribe-in-Subscribe thì khá tệ, dẫn đến việc hiện thị sai dữ liệu thì chúng ta có cách áp dụng cách dưới
VD: ta có 1 select ngân hàng, 1 select chi nhánh, thì mỗi lần mình chọn ngân hàng thì api call chi nhánh, cách xử lý đó là dùng switchMap, nó sẽ calcel api call chi nhánh trước đó. Done
mergeMap -> Nó nhảy vào bên trong, có bao nhiêu số obs thì nó chạy bấy nhiêu lần
mergeMap(truyền) -> chạy theo index lần nào
concatMap -> Giống mergeAll nhưng nó chạy theo thứ tự, nó chỉ xử lý chạy trong concatmap(()=> {})
-> VD: khi mà mình muốn upload ảnh lên trên form, thì submit sẽ call api create
—> Mỗi khi click sẽ subscribe emit(2) và nó sẽ unsubscribe emit(cũ)
fromEvent(document, 'click').pipe(
switchMap(() => interval(1000).pipe(take(10)))
);
—————————————————————————————————————
SUBJECT❤️
Là 1 dạng class bên trong của rxjs và cũng là 1 observer
Khi mà subject có giá trị thì nó next cho Những thằng observer khác
Nó cũng có thể bắn giá trị vào chính stream của chính nó như next() và nó tự subcriber chính nó (đây là cái hay)
Thường sẽ là private readonly subject (Chính vì subject tự truyền giáo trị cho chính nó thế nên là cần sét cho nó private rồi nếu muốn thằng khác dùng thì chỉ cần <this.subject.asObservable()> để gán nó là observable
*** Subject
Khi maf next() bắn dữ liệu mà thằng sau subcribe thì nó sẽ không có dữ liệu (Vì khi thằng subject bắn dữ liệu thì nó ko lưu bất cứ data nào cả trên stream của nó)
*** BehaviorSubject
Cần truyền giá trị ban đầu
Nó khác với Subject là: nó lưu trữ giá trị cuối cùng
*** ReplaySubject
Nó giống với BehaviorSubject
Truyền giá trị số lấy bao nhiêu giá trị cuối cùng
*** ShareReplay
Nó cache lại dữ liệu cuối cùng
Want to print your doc? This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (