摘要:最近組內(nèi)的在做的升級(jí),這當(dāng)中也涉及到了的升級(jí)。所以這也是今天要說(shuō)的一個(gè)重點(diǎn),的實(shí)現(xiàn),是這次版本升級(jí)最根本的地方。
最近組內(nèi)的angular在做4->6的升級(jí),這當(dāng)中也涉及到了rxjs的升級(jí)。rxjs升級(jí)guide鏈接以下是記錄的一些rxjs的升級(jí)小tips
6版本有非常多的break points,總結(jié)下來(lái)為以下三點(diǎn):
比較多的引用路徑變更
一些方法,函數(shù)增棄
chainable==>pipeable
以上幾點(diǎn),在具體實(shí)踐上,1和2根據(jù)api,以及rx提供的升級(jí)檢查工具,都能比較愉快的完成,但比較有意義的第3點(diǎn),作為一個(gè)對(duì)函數(shù)式編程感興趣的前端碼農(nóng),當(dāng)然要研究一下原委。
其實(shí)1和2都有點(diǎn)為第三點(diǎn)服務(wù)的意思,我們先簡(jiǎn)單說(shuō)下1和2。引用路徑的變更,意味著源碼目錄結(jié)構(gòu)的調(diào)整(這些大家可以下載源碼,自行看下);同時(shí),原來(lái)的rx也采用了和underscore、lodash一樣的導(dǎo)出方式,在寫(xiě)法上,滿足chainable,所以用rx5時(shí),我們是這樣寫(xiě)的:
var Rx = require("rxjs"); const Observable = Rx.Observable; Observable.range(1,10) .filter(x => x % 2 === 0) .map(x => x + x) .subscribe(x=> console.log(x))
v5的rx導(dǎo)出了一個(gè)核心對(duì)象Observable以及若干的附屬類(lèi)型對(duì)象,然后方法(自有方法(create、subscribe等),以及一些常用的操作符(map、fileter等))定義在這些對(duì)象的prototype上,所以這種定義方式搞起鏈?zhǔn)秸{(diào)用就666,這種實(shí)現(xiàn)不影響其本質(zhì)上的函數(shù)式,但在寫(xiě)法上其實(shí)是面向?qū)ο蟮膫魏瘮?shù)式,但但是奇奇怪怪的,老是搞對(duì)象是什么鬼,說(shuō)好的FP呢。
所以這也是今天要說(shuō)的一個(gè)重點(diǎn),chainable-->pipeable的實(shí)現(xiàn),是rx這次版本升級(jí)最根本的地方。在內(nèi)部實(shí)現(xiàn)上,把原有的操作符都函數(shù)化,同時(shí)在Observable上新增了pipe方法,以下是pipe.ts中的pipe實(shí)現(xiàn)
export function pipe(...fns: Array >): UnaryFunction { return pipeFromArray(fns); } /* @internal */ export function pipeFromArray (fns: Array >): UnaryFunction { if (!fns) { return noop as UnaryFunction ; } if (fns.length === 1) { return fns[0]; } return function piped(input: T): R { return fns.reduce((prev: any, fn: UnaryFunction ) => fn(prev), input); }; }
熟悉FP的同學(xué)會(huì)發(fā)現(xiàn),這個(gè)pipe其實(shí)是一個(gè)從左向右執(zhí)行的compose,只不過(guò)它接受的第一個(gè)參數(shù)是this,即當(dāng)前Observable實(shí)例,所以我們第一個(gè)例子在v6中得這么寫(xiě):
import { range } from "rxjs/observable/range"; import { map, filter } from "rxjs/operators"; range(0, 10).pipe( filter(x => x % 2 === 0), map(x => x + x) ).subscribe(x=> console.log(x))
上例pipe做的事情等同于:mapFn(filterFn(range(0,10)))
chainable==>到pipeable,在寫(xiě)法上是一次更加徹底的函數(shù)式實(shí)踐。
當(dāng)然這種方法->函數(shù)的更改,還有一些更大的好處:
打包時(shí)的按需引入,tree-shake
更好的用戶自定義:更安全(避免對(duì)象prototype定義的全局污染),更方便
寫(xiě)法上更函函數(shù)式:方便用戶進(jìn)行函數(shù)的compose,curry操作,呼應(yīng)2的更方便的自定義
其它更詳盡的點(diǎn),可參考:
rx團(tuán)隊(duì)的說(shuō)明
原文來(lái)自:https://zhuanlan.zhihu.com/p/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/96519.html
摘要:對(duì)對(duì)象發(fā)出的每個(gè)值,使用指定的函數(shù),進(jìn)行映射處理。示例圖以上代碼運(yùn)行后,控制臺(tái)的輸出結(jié)果緩沖源對(duì)象已發(fā)出的值,直到大小達(dá)到給定的最大。該操作符也會(huì)先處理前一個(gè)對(duì)象,在處理下一個(gè)對(duì)象。 map 對(duì) Observable 對(duì)象發(fā)出的每個(gè)值,使用指定的 project 函數(shù),進(jìn)行映射處理。 var source = Rx.Observable.interval(1000); var newe...
摘要:操作符防抖動(dòng),只有當(dāng)另一個(gè)發(fā)射值時(shí),才取源的最新數(shù)據(jù)進(jìn)行發(fā)射,其他數(shù)據(jù)取消發(fā)射。輸出從源數(shù)據(jù)集的第一項(xiàng)開(kāi)始進(jìn)行發(fā)射,直到另一個(gè)開(kāi)始發(fā)射第一個(gè)值時(shí),源停止發(fā)射值。 rxjs5.x filter操作符api debounce 防抖動(dòng),只有當(dāng)另一個(gè)Observable發(fā)射值時(shí),才取源Obervable的最新數(shù)據(jù)進(jìn)行發(fā)射,其他數(shù)據(jù)取消發(fā)射。 // 每次點(diǎn)擊,且當(dāng)計(jì)時(shí)器的最新值未被發(fā)射時(shí),才從計(jì)...
摘要:使用的操作符這條從左到右的橫線代表經(jīng)過(guò)操作符轉(zhuǎn)換后的輸出流。返回值通過(guò)判定函數(shù)檢測(cè)的值組成的流。返回值持續(xù)發(fā)出輸入流上的值,直到通知流上發(fā)出值為止。 上期介紹過(guò)了rxjs中的三大件,Observable,subscription,subject,但是在開(kāi)發(fā)過(guò)程我們最常接觸到的東西非操作符莫屬。比如上期代碼中曾出現(xiàn)過(guò)的from就是一個(gè)操作符。rxjs中的操作符大致上可以分為幾類(lèi),創(chuàng)建類(lèi),...
摘要:前端日?qǐng)?bào)精選漫談函數(shù)式編程一十年蹤跡的博客前端每周清單的優(yōu)勢(shì)與劣勢(shì)有望超越在嵌入式及物聯(lián)網(wǎng)的應(yīng)用現(xiàn)狀進(jìn)階系列高階組件詳解一前端之路譯如何充分利用控制臺(tái)掘金程序猿升級(jí)攻略眾成翻譯中文譯如何充分利用控制臺(tái)掘金前端從強(qiáng)制開(kāi)啟壓縮探 2017-06-27 前端日?qǐng)?bào) 精選 漫談 JS 函數(shù)式編程(一) - 十年蹤跡的博客前端每周清單: Vue的優(yōu)勢(shì)與劣勢(shì);Node.js有望超越Java;JS在嵌...
摘要:詳見(jiàn)騰訊正式版發(fā)布基于與的機(jī)器學(xué)習(xí)高性能計(jì)算平臺(tái)在談及新一代平臺(tái)時(shí),黃明表示,是此次平臺(tái)升級(jí)的一大亮點(diǎn),而只是生態(tài)圈的第一個(gè)成員。對(duì)此,黃明表示,在的開(kāi)發(fā)過(guò)程中,我們一直都是在同和對(duì)標(biāo)性能。 機(jī)器之心原創(chuàng) 作者:高靜宜 2017 年 6 月 16 日,騰訊新一代高性能計(jì)算平臺(tái) Angel 在 Github 上低調(diào)開(kāi)源。開(kāi)源兩周,這個(gè)項(xiàng)目在 Github 上持續(xù)得到關(guān)注,截至目前為止,已...
閱讀 1484·2021-11-22 09:34
閱讀 2663·2021-11-12 10:36
閱讀 1182·2021-11-11 16:55
閱讀 2396·2020-06-22 14:43
閱讀 1523·2019-08-30 15:55
閱讀 2038·2019-08-30 15:53
閱讀 1826·2019-08-30 10:50
閱讀 1275·2019-08-29 12:15