JavaScript Rxjs mergeMap 的使用場合
注意:
- flatMap 是 mergeMap 的別名。
- 如果一次只能激活一個內部訂閱,請使用 switchMap.
- 如果內部 observables 的發(fā)射和訂閱順序很重要,請使用 concatMap.
當需要展平內部 observable 但想要手動控制內部訂閱的數量時,是 mergeMap 極佳的使用場合。
例如,當使用 switchMap 時,每個內部訂閱在源發(fā)出時完成,即任意時間段只允許一個活動的內部訂閱。相比之下,mergeMap 允許同時激活多個內部訂閱。因此,mergeMap 最常見的用例之一是不應取消的請求,這些請求被認為是寫入而不是讀取。
一個典型的例子就是 SAP 電商云購物車里不同行項目的金額,可以并行地進行增減操作。
請注意,如果這些寫入必須保持順序,則 concatMap 是更好的選擇。比如數據庫的寫操作。
由于 mergeMap 一次維護多個活動的內部訂閱,因此可能會由于長期存在的內部訂閱造成內存泄漏。一個基本的例子是,如果使用內部計時器或 dom 事件流映射到可觀察對象。在這些情況下,如果仍然希望使用 mergeMap,一個好辦法是利用另一個運算符來管理內部訂閱的完成,比如考慮 take 或 takeUntil。當然還可以使用 concurrent 參數限制一次活動內部訂閱的數量。
看一個例子:
import { fromEvent, of } from 'rxjs'; import { mergeMap, delay } from 'rxjs/operators'; // faking network request for save const saveLocation = location => { return of(location).pipe(delay(500)); }; // streams const click$ = fromEvent(document, 'click'); click$ .pipe( mergeMap((e: MouseEvent) => { return saveLocation({ x: e.clientX, y: e.clientY, timestamp: Date.now() }); }) ) // Saved! {x: 98, y: 170, ...} .subscribe(r => console.log('Saved!', r));
saveLocation 是一個函數,它能把任何傳入的輸入參數,包裹成一個 Observable,并且這個 Observable 并不是立即 emit 數據,而是延遲 500 毫秒。
mergeMap 接收一個函數作為輸入參數,這個函數的輸入參數就是通過 pipe 鏈接 mergeMap 的 Observable 里包含的元素,即 MouseEvent;project 返回的數據類型是一個新的 Observable,包含了屏幕點擊的 X 和 Y 坐標以及當前時間戳。
最后產生的輸出:
到此這篇關于JavaScript Rxjs mergeMap 的使用場合的文章就介紹到這了,更多相關JS Rxjs mergeMap 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
npm install 、npm install --save 和&n
這篇文章主要介紹了npm install 、npm install --save 和 npm install --save-dev的區(qū)別介紹,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04javascript中call,apply,callee,caller用法實例分析
這篇文章主要介紹了javascript中call,apply,callee,caller用法,結合實例形式分析了javascript中call,apply,callee,caller功能、使用方法及相關操作注意事項,需要的朋友可以參考下2019-07-07uniapp開發(fā)H5使用formData上傳文件解決方案
我們很多時候上傳文件就是使用FormData,然而uniapp默認不支持FormData類型數據的上傳,下面這篇文章主要給大家介紹了關于uniapp開發(fā)H5使用formData上傳文件的相關資料,需要的朋友可以參考下2023-12-12