成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

RxJS 6有哪些新變化?

LeanCloud / 768人閱讀

摘要:有哪些新變化于年月日正式發(fā)布,為開發(fā)人員帶來了一些令人興奮的增補(bǔ)和改進(jìn)。不要移除包,直到你將所有的鏈?zhǔn)讲僮餍薷臑楣艿啦僮鞣?/p>

RxJS 6有哪些新變化?

RxJs 6于2018年4月24日正式發(fā)布,為開發(fā)人員帶來了一些令人興奮的增補(bǔ)和改進(jìn)。Ben Lesh, rxJS核心開發(fā)成員,強(qiáng)調(diào):

RxJS 6在擁有更小API的同時(shí),帶來了更整潔的引入方式

提供一個(gè)npm包,該package可以處理RxJS的向后兼容性,使得開發(fā)人員可以在不更改代碼的情況下進(jìn)行更新,同時(shí)還可以幫助TypeScript代碼自動(dòng)遷移。

RxJs 6這些新的改動(dòng)為開發(fā)人員提供了以下三方面的優(yōu)化:模塊化方面的改進(jìn)、性能提升、調(diào)試更方便。RxJs團(tuán)隊(duì)盡力保持新版本的向后兼容性,但是為了減少RxJs的API數(shù)量,還是引入了一些重大修改。

下面讓我們一起來看一下RxJs團(tuán)隊(duì)在新版本中引入了哪些修改。

RxJS 6的向后兼容性

為了便捷地從RxJS 5遷移到RxJS 6,RxJS團(tuán)隊(duì)發(fā)布了一個(gè)名為rxjs-compat的兄弟軟件包。該軟件包在v6v5的API之間創(chuàng)建了一個(gè)兼容層。
RxJs團(tuán)隊(duì)建議開發(fā)人員通過安裝^6.0.0版本的rxjsrxjs-compat包來升級(jí)現(xiàn)有應(yīng)用:

npm install rxjs@6 rxjs-compat@6 --save

此包允許您在升級(jí)RxJS 6的同時(shí)繼續(xù)運(yùn)行現(xiàn)有代碼庫,而不會(huì)出現(xiàn)問題。他支持在RxJs 6中移除掉的功能。
安裝rxjs-compat會(huì)導(dǎo)致打包后代碼包體積的增加,如果你使用的是4.0.0版本以下的Webpack,該影響會(huì)被放大。
因此建議升級(jí)完成后將rxjs-compat移除。

使用rxjs-compat升級(jí)RxJS的限制

只有兩個(gè)重大修改在rxjs-compat中未覆蓋:

TypeScript原型操作符

在極少數(shù)情況下,您的代碼庫定義了它自己的TypeScript原型操作符并修改了Observable命名空間。該情況下,您需要更新你的操作符相關(guān)代碼才能使TypeScript正常編譯。

在版本發(fā)布說明中,用戶自定義的原型操作符可按如下方式創(chuàng)建:

Observable.prototype.userDefined = () => {
  return new Observable((subscriber) => {
    this.subscribe({
      next(value) { subscriber.next(value); },
      error(err) { subscriber.error(err); },
      complete() { subscriber.complete(); },
   });
  });
});

source$.userDefined().subscribe();

為編譯該類型的自定義操作符,需要做如下修改:

const userDefined = () => (source: Observable) => new Observable((subscriber) => {
    this.subscribe({
      next(value) { subscriber.next(value); },
      error(err) { subscriber.error(err); },
      complete() { subscriber.complete(); },
   });
  });
});

source$.pipe(
  userDefined(),
)
同步錯(cuò)誤處理

不再支持在try / catch塊內(nèi)調(diào)用Observable.subscribe()。使用用Observable.subscribe()方法中的錯(cuò)誤回調(diào)方法替換原先的try / catch塊來完成的異步錯(cuò)誤的處理。
示例如下:

// deprecated
try {
  source$.subscribe(nextFn, undefined, completeFn);
} catch (err) {
  handleError(err);
}

// use instead
source$.subscribe(nextFn, handleError, completeFn);

現(xiàn)在在Observable.subscribe()中必須定義一個(gè)錯(cuò)誤回調(diào)方法來異步處理錯(cuò)誤。

刪除RxJs兼容層前需要做的修改

如上所訴,rxjs-compat提供了V5v6API間的臨時(shí)兼容層,實(shí)質(zhì)上rxjs-compat為您的代碼庫提供了所需的v5版本功能,使得您可以逐步將您的代碼庫升級(jí)到v6版本。為了完成升級(jí)并移除rxjs-compat依賴,您的代碼庫需要重構(gòu)并停止使用v5版本中的如下功能:

修改import路徑

建議TypeScript開發(fā)人員使用rxjs-tslint來重構(gòu)import路徑。
RxJS團(tuán)隊(duì)設(shè)計(jì)了以下規(guī)則來幫助JavaScript開發(fā)人員重構(gòu)import路徑:

rxjs: 包含創(chuàng)建方法,類型,調(diào)度程序和工具庫。

import { Observable, Subject, asapScheduler, pipe, of, from, interval, merge, fromEvent } from "rxjs";

rxjs/operators: 包含所有的管道操作符

import { map, filter, scan } from "rxjs/operators";

rxjs/webSocket: 包含websocket subject實(shí)現(xiàn).

import { webSocket } from "rxjs/webSocket";

rxjs/ajax: 包含Rx ajax實(shí)現(xiàn).

import { ajax } from "rxjs/ajax";

rxjs/testing: 包含RxJS的測試工具庫.

import { TestScheduler } from "rxjs/testing";

以下是一項(xiàng)小調(diào)查:您是否有常識(shí)使用rxjs-tslint升級(jí)您的應(yīng)用程序?

使用管道操作而不是鏈?zhǔn)讲僮?/b>

使用新的管道操作符語法替換舊有的鏈?zhǔn)讲僮?。上一個(gè)操作符方法的結(jié)果會(huì)被傳遞到下一個(gè)操作符方法中。
不要移除rxjs-compat包,直到你將所有的鏈?zhǔn)讲僮餍薷臑楣艿啦僮鞣?。如果您使用TypeScript, ts-lint會(huì)在某種程度上自動(dòng)執(zhí)行此項(xiàng)重構(gòu)。
Ben Lesh在ng-conf 2018上解釋了為什么我們應(yīng)該使用管道操作符。

請(qǐng)按照如下步驟將您的鏈?zhǔn)讲僮魈鎿Q為管道操作:

rxjs-operators中引入您需要的操作符

注意:由于與Javascript保留字沖突,以下運(yùn)算符名字做了修改:do -> tap, catch ->
catchError, switch -> switchAll, finally -> finalize
import { map, filter, catchError, mergeMap } from "rxjs/operators";

使用pipe()包裹所有的操作符方法。確保所有操作符間的.被移除,轉(zhuǎn)而使用,連接。記?。。?!有些操作符的名稱變了?。?!
以下為升級(jí)示例:

// an operator chain
source
  .map(x => x + x)
  .mergeMap(n => of(n + 1, n + 2)
    .filter(x => x % 1 == 0)
    .scan((acc, x) => acc + x, 0)
  )
  .catch(err => of("error found"))
  .subscribe(printResult);

// must be updated to a pipe flow

source.pipe(
  map(x => x + x),
  mergeMap(n => of(n + 1, n + 2).pipe(
    filter(x => x % 1 == 0),
    scan((acc, x) => acc + x, 0),
  )),
  catchError(err => of("error found")),
).subscribe(printResult);

注意我們?cè)谝陨洗a中嵌套使用了pipe()。

使用函數(shù)而不是類

使用函數(shù)而不是類來操作可觀察對(duì)象(Observables)。所有的Observable類已被移除。他們的功能被新舊操作符及函數(shù)替代。這些替代品的功能與之前的類功能一模一樣。
示例如下:

// removed
ArrayObservable.create(myArray)

// use instead

from(myArray)

// you may also use

new operator fromArray().

有關(guān)替換v5類為v6函數(shù)的完整列表,請(qǐng)查看RxJS文檔。

特殊情況

ConnectableObservable在v6中不能直接使用,要訪問它,請(qǐng)使用操作符multicast,publishpublishReplaypublishLast。

SubscribeOnObservable在v6中不能直接使用,要訪問它,請(qǐng)使用操作符subscribeOn

移除resultSelector

Result Selectors是一項(xiàng)沒有被廣泛使用甚至沒有文檔說明的RxJs特性,同時(shí)Result Selectors嚴(yán)重的增加了RxJs代碼庫的體積,因此RxJs團(tuán)隊(duì)決定棄用或刪除他。

對(duì)于使用到該功能的開發(fā)人員,他們需要將esultSelector參數(shù)替換為外部代碼。

對(duì)于first(), last()這兩個(gè)函數(shù),這些參數(shù)已被移除,在刪除rxjs-compat之前務(wù)必升級(jí)代碼。

對(duì)于其他擁有resultSelector參數(shù)的函數(shù),如mapping操作符,該參數(shù)已被棄用,并
以其他方式重寫。如果您移除rxjs-compat,這些函數(shù)仍可正常工作,但是RxJs團(tuán)隊(duì)聲明他們必須在v7版本發(fā)布之前將其移除。

針對(duì)該情況的更多詳情,請(qǐng)查閱RxJs文檔

其他RxJs6棄用 Observable.if and Observable.throw

Observable.if已被iif()取代,Observable.throw已被throwError()取代。您可使用rxjs-tslint將這些廢棄的成員方法修改為函數(shù)調(diào)用。

代碼示例如下:

OBSERVABLE.IF > IIF()
// deprecated
Observable.if(test, a$, b$);

// use instead

iif(test, a$, b$);
OBSERVABLE.ERROR > THROWERROR()
// deprecated
Observable.throw(new Error());

//use instead

throwError(new Error());
已棄用的方法

根據(jù)遷移指南,以下方法已被棄用或重構(gòu):

merge
import { merge } from "rxjs/operators";
a$.pipe(merge(b$, c$));

// becomes

import { merge } from "rxjs";
merge(a$, b$, c$);
concat
import { concat } from "rxjs/operators";
a$.pipe(concat(b$, c$));

// becomes

import { concat } from "rxjs";
concat(a$, b$, c$);
combineLatest
import { combineLatest } from "rxjs/operators";
a$.pipe(combineLatest(b$, c$));

// becomes

import { combineLatest } from "rxjs";
combineLatest(a$, b$, c$);
race
import { race } from "rxjs/operators";
a$.pipe(race(b$, c$));

// becomes

import { race } from "rxjs";
race(a$, b$, c$);
zip
import { zip } from "rxjs/operators";
a$.pipe(zip(b$, c$));

// becomes

import { zip } from "rxjs";
zip(a$, b$, c$);
總結(jié)

RxJS 6帶來了一些重大改變,但是通過添加rxjs-compat軟件包可以緩解這一問題,該軟件包允許您在保持v5代碼運(yùn)行的同時(shí)逐漸遷移。對(duì)于Typescript用戶,其他中包括大多數(shù)Angular開發(fā)人員,tslint提供了大量的自動(dòng)重構(gòu)功能,使轉(zhuǎn)換變得更加簡單。

任何升級(jí)與代碼修改都會(huì)引入一些bug到代碼庫中。因此請(qǐng)務(wù)必測試您的功能以確保您的終端用戶最終接受到相同的質(zhì)量體驗(yàn)。

視頻:RxJS 6詳細(xì)介紹 by Ben Lesh

原文鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95141.html

相關(guān)文章

  • Angular 5.0 來了! 這些大變化

    摘要:以下簡單介紹的重大變化。狀態(tài)轉(zhuǎn)交及對(duì)的支持這樣更便于在服務(wù)端和客戶之間共享應(yīng)用狀態(tài)。狀態(tài)轉(zhuǎn)交的相關(guān)文檔幾周后會(huì)發(fā)布。我們刪除很多以前廢棄的如,也公布了一些新的廢棄項(xiàng)。以上指南會(huì)詳細(xì)介紹這些變更。已知問題當(dāng)前已知與相關(guān)的問題。 我們很高興地宣布Angular 5.0.0——五角形甜甜圈發(fā)布啦!這又是一個(gè)主版本,包含新功能并修復(fù)了很多bug。它再次體現(xiàn)了我們把Angular做得更小、更快、...

    張紅新 評(píng)論0 收藏0
  • Angular 5.0 來了! 這些大變化

    摘要:以下簡單介紹的重大變化。狀態(tài)轉(zhuǎn)交及對(duì)的支持這樣更便于在服務(wù)端和客戶之間共享應(yīng)用狀態(tài)。狀態(tài)轉(zhuǎn)交的相關(guān)文檔幾周后會(huì)發(fā)布。我們刪除很多以前廢棄的如,也公布了一些新的廢棄項(xiàng)。以上指南會(huì)詳細(xì)介紹這些變更。已知問題當(dāng)前已知與相關(guān)的問題。 我們很高興地宣布Angular 5.0.0——五角形甜甜圈發(fā)布啦!這又是一個(gè)主版本,包含新功能并修復(fù)了很多bug。它再次體現(xiàn)了我們把Angular做得更小、更快、...

    DobbyKim 評(píng)論0 收藏0
  • Rxjs 響應(yīng)式編程-第一章:響應(yīng)式

    摘要:響應(yīng)式編程具有很強(qiáng)的表現(xiàn)力,舉個(gè)例子來說,限制鼠標(biāo)重復(fù)點(diǎn)擊的例子。在響應(yīng)式編程中,我把鼠標(biāo)點(diǎn)擊事件作為一個(gè)我們可以查詢和操作的持續(xù)的流事件。這在響應(yīng)式編程中尤其重要,因?yàn)槲覀冸S著時(shí)間變換會(huì)產(chǎn)生很多狀態(tài)片段。迭代器模式的另一主要部分來自模式。 Rxjs 響應(yīng)式編程-第一章:響應(yīng)式Rxjs 響應(yīng)式編程-第二章:序列的深入研究Rxjs 響應(yīng)式編程-第三章: 構(gòu)建并發(fā)程序Rxjs 響應(yīng)式編程-...

    songze 評(píng)論0 收藏0
  • 2018前端值得關(guān)注的技術(shù)

    摘要:年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會(huì)興起,哪些技術(shù)會(huì)沒落。自從谷歌提出后,就持續(xù)的獲得了業(yè)界的關(guān)注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應(yīng)用同等的待遇與權(quán)限。但是無論都值得關(guān)注。 1.前言 2017悄然過去,2018已經(jīng)來到。人在進(jìn)步,技術(shù)在發(fā)展。2018年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會(huì)興起,哪些技術(shù)會(huì)沒落。下面就我個(gè)人的判斷進(jìn)行一個(gè)預(yù)測判斷,希望能對(duì)大家...

    xiao7cn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<