问: 假设我有这个脚本: export.bash #!...echo $VAR 有没有一种方法可以通过只执行 export.bash 而不 source 它获取 $VAR? 答: 不可以。 但是有几种可能的解决办法。...在调用 shell 的上下文中执行脚本: $ cat set-vars1.sh export FOO=BAR $ . set-vars1.sh $ echo $FOO BAR 另一种方法是在脚本中打印设置环境变量的命令...-f 指 shell 函数 -n 从每个(变量)名称中删除 export 属性 -p 显示所有导出变量和函数的列表 ---- 参考: stackoverflow question 16618071...help eval 相关阅读: 用和不用export定义变量的区别 在shell编程中$(cmd) 和 `cmd` 之间有什么区别 ----
本系列分三部曲:《框架实现》 《框架使用》 与 《数据流哲学》,这三篇是我对数据流阶段性的总结,正好补充之前过时的文章。 本篇是收官之作 《前端数据流哲学》。...(开个玩笑,rxjs 社区不乏深耕多年的巨匠)所以最近 rxjs 又被炒的火热。 所以,从时间顺序来看,我们可以从 redux - mobx - rxjs 的顺序解读这三个框架。...岂不就是 cyclejs 吗? 多提一句,rxjs 对数据流纯函数的抽象能力非常强大,因此前端主要工作在于抽一个工具,将诸如事件、请求、推送等等副作用都转化为数据源。...对框架封装的抽象度越高,框架之间差异就越小,渐渐的,我们会从框架名称的讨论中解放,演变成对框架 + 数据流哪种组合更加合适的思考。...其实这有点像 webpack 等插件的机制: export default (context) => {} 每次申明插件,都可以从函数中拿到传来的数据,那么通过数据流的 Connect 能力,将数据注入到组件
它有两个数字型的参数,第一个是首次等待时间,第二个是重复间隔时间。从图上可以看出,它实际上是个无尽流 —— 没有终止线。因此它会按照预定的规则往流中不断重复发出数据。...合并创建器 我们不但可以直接创建流,还可以对多个现有的流进行不同形式的合并,创建一个新的流。常见的合并方式有三种:并联、串联、拉链。 merge - 并联 ?...从图上我们可以看到两个流中的内容被合并到了一个流中。只要任何一个流中出现了值就会立刻被输出,哪怕其中一个流是完全空的也不影响结果 —— 等同于原始流。...从图中我们可以看到两个流中的内容被按照顺序放进了输出流中。前面的流尚未结束时(注意竖线),后面的流就会一直等待。 这种工作方式非常像电路中的串联行为,因此我称其为串联创建器。...从图上我们可以看到,两个输入流中分别出现了一些数据,当仅仅输入流 A 中出现了数据时,输出流中什么都没有,因为它还在等另一个“齿”。
然后我们将创建一个Observable,看看响应式思维和RxJS是怎么样改善现有技术,让你成为更快乐,更多高效的程序员。 什么是响应式? 让我们从一个小的响应性RxJS程序开始。...在响应式编程中,我把鼠标点击事件作为一个我们可以查询和操作的持续的流事件。想象成流而不是一个孤立的事件,这种想法开辟了一种全新的思考方式。我们可以在其中操纵尚未创建的整个值的流。 好好想想。...对于像Ajax请求这样的常见操作,通常有一个Operator可供我们使用。 在这种情况下,RxJS DOM库提供了几种从DOM相关源创建Observable的方法。...从JavaScript事件创建Observable 当我们将一个事件转换为一个Observable时,它就变成了一个可以组合和传递的第一类值。...我们从原始的allMoves中创建了两个Observable。
# 创建类操作符 功能需求 适用操作符 直接操作观察者 create 根据有限的数据产生同步数据流 of 产生一个数值范围内的数据 range 以循环方式产生数据 generate 重复产生数据流中的数据...重要的是,创建类操作符往往不会从其他 Observable 对象获取数据,在数据管道中,创建类操作符就是数据流的源头。因为创建类操作符的这个特性,创建类操作符大部分(并不是全部)都是静态操作符。...# repeat:重复数据的数据流 repeat 的功能是可以重复上游 Observable 中的数据若干次。...repeated 是一个全新的 Observable 对象,它并没有改变 source ,source 自始至终还是只产生 1、2、3 然后就结束的数据流,在 repeat 的作用下,source...DOM 中获得数据,还可以从 Node.js 的 events 中获得数据: import { Observable } from 'rxjs/Observable'; import EventEmitter
我本可以让用户注册一个 JavaScript 函数,每当接收到新数据时便调用此函数,但我最后决定使用 RxJS 库 (JavaScript 的响应式扩展库),它包括用于转换,组合和查询数据流的各种方法。...我们的开发思路如下:我们从设备中获取传入的脑电波样本流 (如上所述,muse-js 将提供 RxJS Observable),然后过滤出我们所需的 AF7 电极 (也就是左眼),再然后我们会在信号中找寻峰值...在这个示例中,它是一个 Angular 应用,其实只是用 Angular CLI 创建的空项目,但也可以使用 React/VueJS,随你喜欢,因为很少会有框架相关的代码。...在组件中,我们会创建一个 MuseClient 的实例: ? 现在我们将进入略微有些棘手的部分:连接头戴设备的逻辑。...并抛弃前一个流中仍未发出的值0。
对于函数式编程,我们并不陌生,在 我的 JS 专栏 里面可以找到很多相关文章~~ 这里不妨先对函数式编程特性做简要回顾: 函数是一等公民(意味着可以把函数赋值给变量或存储在数据结构中,也可以把函数作为其它函数的参数或者返回值...) 高阶函数(接受函数作为参数或者返回一个函数的函数) 没有隐式输入、输出(输入通过函数入参传递,输出通过函数 return 进行返回) 值的不变性(指在程序状态改变时,不直接修改当前数据,而是创建并追踪一个新数据...OK,说到这里,对函数式编程有了一个大体的回顾,下面就介绍今天的主角 —— 函数响应式编程 正文 从名字上来看,就是多了 响应 二字,什么是“响应”? 各位一定不陌生!...事件流 函数响应式编程(FRP) 可以更加有效率地处理事件流,而无需管理状态。...、特点、以及相互之间的关系;也借助 RxJS 了解了函数响应式编程的代码实现; 后续还将带来更多关于 RxJS 的相关内容~ 如果觉得还不错的话,不如点个吧 O(∩_∩)O 我是掘金安东尼,输出暴露输入
随着前端越来越复杂,框架越来越内聚,数据流方案由分到合,由合又到了分,如今数据流逐渐从框架中解绑,形成了一套通用体系,供各个框架使用。...虽然数据流框架很多,但基本上可以分为 双向数据流党、单向数据流党、响应式数据流党,分别以 Mobx、Redux、Rxjs 为代表呈现三国鼎立之状,顺带一提,对 css 而言也有 css in js 和纯...3.1 响应式数据流是最好的方案吗? 我认为前端数据流方案迭代至今,并不存在比如:面向对象 -> 函数式 -> 响应式,这种进化链路,不同业务场景下都有各自优势。...本地状态 可以参考 dva 框架的设计,如果没有全局 Redux 就创建一个,否则就挂载到全局 Redux 上。...业务组件推荐使用内部数据流操作,但最终还是会将视图数据存在全局 Store 中,只是对组件而言,是局部的,对项目而言是全局的,而且这样对特定的情况,比如其他组件复用数据变更的监听可以支持到。
是否还需要 redux 正如很多人说的,这要看我们是怎么使用 redux 了。 在之前一篇精读 前端数据流哲学 中,我提到了 redux、mobx、rxjs 这三大流派的竞争力。...其中 redux 其实是最没有竞争力的数据流框架,我们暂且抛开函数式和优雅性不说,从功能上说,看看 redux 到底做了啥?利用 react 特性,利用全局数据流解决组件间数据通信问题。...我觉得几乎不可能。 新的 Context API 给了开发者创造多个 context 的能力,可不是在项目中创建多个 store,制造混乱的呀。...然而共享一个 context 可能会冲突啊,现在你创建你的,我创建我的,咱们都互不影响,未来数据流框架大家会用的更爽,甚至一个项目可以同时并存多套数据流框架,因为互不影响嘛。...当然这次变化带来最乐观的改变是,react 拥有了一个稳定好用的依赖注入官方 api,在处理国际化这种需要拿 Context 小用一下的场景,可以不依赖第三方库了!
准备项目 我使用typescript来介绍rxjs. 因为我主要是在angular项目里面用ts....Observer可以提供: 一个可以处理流(stream)上的next的值的function 处理错误的function 处理流结束的function 创建Observable Observable.from...结果如下: 用现实世界中炼钢生产流程的例子来解释使用Operator来进行Reactive数据流处理的过程: 原料(矿石)整个过程中会经过很多个工作站, 这里每个工作站都可以看作是RxJS的operator...运行结果如下: 相当于: Hot 和 Cold Observable Cold: Observable可以为每个Subscriber创建新的数据生产者 Hot: 每个Subscriber从订阅的时候开始在同一个数据生产者那里共享其余的数据...从原理来说是这样的: Cold内部会创建一个新的数据生产者, 而Hot则会一直使用外部的数据生产者. 举个例子: Cold: 就相当于我在腾讯视频买体育视频会员, 可以从头看里面的足球比赛.
但在响应式编程中,变量 a 的值会随时跟随 b,c 的变化而变化。 响应式编程的思路大概如下:你可以用包括 Click 和 Hover 事件在内的任何东西创建 Data stream。...任何东西都可以是一个 Stream:变量、用户输入、属性、Cache、数据结构等等。 流 概括来说,流的本质是一个按时间顺序排列的进行中事件的序列集合。我们可以对一个或多个流进行过滤、转换等操作。...我们看看在 RXJS 中怎么创建一个 Observable: const Rx = require('rxjs/Rx'); const newObservable = Rx.Observable.create...Observer 在信号流中是一个观察者(哨兵)的角色,它负责观察任务执行的状态并向流中发射信号。...: () =>void): Subscription; 从入参来看,从左至右依次是 next、error,complete,并且是可选的,我们可以自己选择性的传入相关回调,因为他们都是可选的。
如果你是一个前端开发者,那么你一定知道前端三大框架vue,angular,react。今天我们就来聊一聊angular的发展史。 AngularJS vs Angular 这两个是一个东西吗?...不在继续老版本的更新了,而是推出了一个全新的版本angular2,这个版本因为从底层彻底重构了,所以它和之前的angularjs可以说不是一个框架了,因此,现在人们讨论的angular都是angular...而Angular就采用了typescript来进行框架的构建,这样使得它的开发迭代变得异常迅猛。 rxjs 它是使用Observables进行响应式编程库,表示我们可以订阅异步数据流。...该库提供了内置的运算符,用于观察,转换和过滤流,甚至将多个流组合在一起以一次创建更强大的数据流。Angular将所有信息作为从路由参数到HTTP响应的可观察流处理。...将被依赖的对象传给依赖者,而不需要依赖者自己去创建或查找所需对象是依赖注入的基本原则。 正是这样的设计思想,让angular的各个功能都通过依赖注入,使得代码耦合大大降低。
可能是痛点还没有到难以忍受的地步,或许是现有应用还不够复杂,我目前为止还没接触到必须要应用 Rx 的场景....我觉得应该反过来,采取刻意学习的方式来学习 Rx, 以流的方式来思考,再将其放在现有的场景中看是否有更简洁的解决方案或化学反应. 不得不说写 Rx 是一个比较有趣的事情。..., 根据需求在 rxjs 工具箱中查找合适的操作符....另外由原本的两个流合并为单个流, 在 rxjs 工具箱中可以找到combineLatest操作符符合该场景....数据流抽象: 首先识别变动的实体, 变动的实体就是 todos 列表, 所以可以认为 todos 列表就是一个流. 它从 localStorage 中恢复 初始化状态.
Observer可以提供: 一个可以处理流(stream)上的next的值的function 处理错误的function 处理流结束的function 创建Observable Observable.from...结果如下: 用现实世界中炼钢生产流程的例子来解释使用Operator来进行Reactive数据流处理的过程: 原料(矿石)整个过程中会经过很多个工作站, 这里每个工作站都可以看作是RxJS的operator...运行结果如下: 相当于: Hot 和 Cold Observable Cold: Observable可以为每个Subscriber创建新的数据生产者 Hot: 每个Subscriber从订阅的时候开始在同一个数据生产者那里共享其余的数据...从原理来说是这样的: Cold内部会创建一个新的数据生产者, 而Hot则会一直使用外部的数据生产者. 举个例子: Cold: 就相当于我在腾讯视频买体育视频会员, 可以从头看里面的足球比赛....也可以这样理解BehaviorSubject的特点: 它代表一个随时间变化的值, 例如, 生日的流就是Subject, 而一个人的年龄流就是BehaviorSubject.
四、rxjs 我相信很多人听说过rxjs学习曲线异常陡峭,是的,除了眼花缭乱的各类操作符(目前rxjs V6版本有120+个),关键是它要求我们在处理事务的时候要贯彻“一切皆为流”的理念,更是让初学者难以理解...在开始介绍rxjs之前,我们先来简单地聊聊什么是响应式编程?我以一个很简单的小例子来看:a + b = c。...在rxjs中,作为事件响应者(消费者)的Observer对象也有一个next属性(回调函数),用来接收从发布者那里“推”过来的数据。...,和lodash一样,拥有众多强大的操作符来操作数据流,不光是同步数据,特别是针对各种复杂的异步数据流,甚至可以多种事件流组合搭配,汇总到一起处理; 3)更独立:rxjs并不依赖于任何一个框架,它可以任意搭配...尤其是异步数据)混杂时,建议使用rxjs; 其实回顾全篇,我没有提到一个关键点是,各个库的性能对比如何。
基础实现 有了上面的概念及伪代码,那么在 RxJS 中是怎么创建 Observable 与 Observer 的呢?...创建 Observable RxJS 提供 create 的方法来自定义创建一个 Observable,可以使用 next 来发出流。...操作流将产生新流,从而保持流的不可变性,这也是 RxJS 中函数式编程的一点体现。...关于函数式编程,这里暂不多讲,可以看看另外一篇文章 《谈谈函数式编程》 到这里,我们知道了,流从产生到最终处理,可能经过的一些操作。...使用 RxJS 一步步实现搜索示例 RxJS 提供许多创建流或操作流的接口,应用这些接口,我们来一步步将搜索的示例进行 Rx 化。
例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中...double findMedian() - 返回目前所有元素的中位数。...题解: 1 开一个最小栈 最大栈 (都是栈顶存放最值) 2 先放到最大栈(右边) ,然后再移动到 最小栈(左边) //构成从大到小的序列来 3 然后判断size %2==0 则返回两个的栈顶元素...=0 返回左边的栈顶 class MedianFinder { PriorityQueue left; PriorityQueue right...right=new PriorityQueue((o1,o2)->o2-o1); //右边的最大栈 } public void addNum
RxJS 中的数据流就是 Observable 对象,Observable 实现了下面两种设计模式: 观察者模式(Observer Pattern) 迭代器模式(Iterator Pattern) #...在 RxJS 的世界中,Observable 对象就是一个发布者,通过 Observable 对象的 subscribe 函数,可以把这个发布者和某个观察者(Observer)连接起来。...// 2 // 3 创建 Observable 对象也就是创建一个“发布者”,一个“观察者”调用某个 Observable 对象的 subscribe 函数,对应的 onSubscribe 函数就会被调用...# 操作符 对于现实中复杂的问题,并不会创造一个数据流之后就直接通过 subscribe 接上一个 Observer,往往需要对这个数据流做一系列处理,然后才交给 Observer。...# 弹珠图 根据弹珠图的传统,竖杠符号|代表的是数据流的完结,对应调用下游的 complete 函数。符号 × 代表数据流中的异常,对应于调用下游的 error 函数。
所谓流, 我们可以把它理解成"水", 类似的, 我们可以把平常普通的数据理解为"冰块"(当然Stream的数据都是有序的). 换句话说, 普通的数据是一个整体, 是不能被分割的....而流是可以被分割的. 而每一个被分割出来的部分的大小都是可控的. 而在NodeJS中我们对这些被分割出来的部分有一个称呼: "Chunk". (基于Webpack打包的JS文件中也能看到这个单词....概念 分类与使用 Stream在NodeJS中存在这么几个基础分类, 为了方便理解, 我还是打算用水和水池来作比喻: Writable: 可写的流....说到这里, 我决定对一个mp4文件创建一个流试试. 啊那么实际上创建出来的确实是一个没法直接解读的流. 一般来说对于这种非文本类型的文件是需要一个专门的解码器的, 这里就不去深入了....都提到Stream了怎么可能不提RxJS, 关于RxJS的介绍可以看看它的官网 虽然不能直接从nodejs的Stream转换到rxjs的Observable, 但是强大的社区已经搞掂了: yarn add
我们用 ref 或reactive 创建的数据,可以等似于 RxJS 的 Observable。只不过响应式数据并不像 rxjs 有显式的事件发布和订阅过程,也不存在事件流(序列)。...在 Vue 中, watch/watcheffects/render 相当于 RxJS 的 subscribe,RxJS 的数据流的终点通常也是副作用处理,比如将数据渲染到页面上。...RxJS 的很多东西并不能直接套用过来,但思想和原则是可以复用的。 其中一个重要的思想就是:管道变换。这是一种思维方式的转变,在以往的编程设计中,我们更多操心的是类、模块、数据结构和算法。...外部状态也是副作用的一种,单独拎出来讲,是因为我们在 Vue 中创建外部状态太容易了,而 RxJS 则相对来说麻烦一些,毕竟外部状态和事件流显得格格不入。...这里提醒一下读者:“不要吝啬创建组件” 我在 React组件设计实践总结04 - 组件的思维 中讲过: 大部分情况下, 组件表示是一个 UI 对象.
领取专属 10元无门槛券
手把手带您无忧上云