rxjs

When should we use the RxJS tap operator?

馋奶兔 提交于 2020-03-01 03:38:29
问题 I do not understand from the docs. Could anyone explain it to me? 回答1: Most of the operators are working in streamed sequence, for example: source$.pipe( map((a: string) => changeAndReturnArray(a)), filter((b: string[]) => giveMeOnlySymbolsThatAreAfterNInAlphabet(b)), switchMap((c: string[]) => putToSomeObservable(c)) .... ); In that example you are not 'breaking' the stream, or jumping outside of it to do some external action. Jumping outside of stream is possible with 'tap' operator, where

rxjs6 模拟实现爬虫

跟風遠走 提交于 2020-02-28 09:32:15
使用rxjs模拟爬虫 首先确定一个接口方法, 该方法随机[0,3]s 完成接口请求 源数据默认16条, 每组4个, 分为4组 使用promise.all用时总计为四组中每组最长时间之和 const {range, from, of} = require('rxjs') const {concatMap, reduce, tap, toArray, map, scan, finalize, bufferCount} = require('rxjs/operators') const fs = require('fs') // 每个api会花费一秒 function download(val) { let time = Math.random() * 3000 return new Promise( resolve => { setTimeout( () => { console.log('down', val) let p = `./tmp/${val}.txt` fs.writeFileSync(p, val) resolve( { done: true, val, time } ) }, time ) } ) } let st = +new Date() range(1, 16).pipe( bufferCount(4), concatMap(items => { let

Chain Actions in an Effect in @ngrx

非 Y 不嫁゛ 提交于 2020-02-28 04:32:31
问题 I am having some trouble chaining actions one after the other in an Effect that makes an HTTP-request. Here's the Effect code: export class UserEffects { @Effect() update$: Observable<Action> = this.actions$.ofType(user.USERCHANGE).pipe( switchMap(data => this.authService.login(data['payload'])), map(userInfo => new UserChangedAction(userInfo)), tap(() => this.store.dispatch( new LoginStateChangeAction(localStorage.getItem('token'))) ) ); constructor(private authService: AuthService, private

rxjs6 Combination Operators

烈酒焚心 提交于 2020-02-28 03:25:15
combineAll 组合多个流, 每次有一个流更新时, 发出所有流最新值的数组 const source$ = of(200, 400, 600) source$.pipe( map(v => interval(v)), combineAll() ).subscribe(console.log) combineLatest 由rxjs导入, 和combineAll作用一样, 用于组合最新的观察值 const {combineLatest, interval, of} = require('rxjs') const {map} = require('rxjs/operators') const source1$ = interval(200) const source2$ = interval(400) const source3$ = interval(600) // 可传入数组或者参数式逐个传入 // combineLatest(source1$, source2$, source3$).subscribe(console.log) combineLatest([source1$, source2$, source3$]).subscribe(console.log) concat / concatAll 串行连接流, 只有当前面的流完成后, 才会从继续后面的流中继续取数据

BehaviorSubject vs Observable?

守給你的承諾、 提交于 2020-02-27 22:54:55
我正在研究Angular RxJs模式,我不明白 BehaviorSubject 和 Observable 之间的区别。 根据我的理解, BehaviorSubject 是一个可以随时间变化的值(可以订阅,订阅者可以接收更新的结果)。 这似乎是 Observable 的完全相同的目的。 你什么时候使用 Observable 和 BehaviorSubject ? 在 Observable 上使用 BehaviorSubject 是否有好处,反之亦然? #1楼 Observable对象表示基于推送的集合。 Observer和Observable接口为基于推送的通知提供了一种通用机制,也称为观察者设计模式。 Observable对象表示发送通知的对象(提供者); Observer对象表示接收它们的类(观察者)。 Subject类继承Observable和Observer,因为它既是观察者又是observable。 您可以使用主题订阅所有观察者,然后将主题订阅到后端数据源 var subject = new Rx.Subject(); var subscription = subject.subscribe( function (x) { console.log('onNext: ' + x); }, function (e) { console.log('onError: ' + e

rxjs6 Subject

℡╲_俬逩灬. 提交于 2020-02-27 20:09:08
Subject 和 Observable 都可以用来自定义流 const subject = new Subject(); subject.subscribe({ next: (v) => console.log(`observerA: ${v}`) }); subject.subscribe({ next: (v) => console.log(`observerB: ${v}`) }); subject.next(1); subject.next(2); observerA: 1 observerB: 1 observerA: 2 observerB: 2 普通subject不具备回放功能 const {Subject} = require('rxjs') const sub = new Subject(); sub.next(1); sub.subscribe(x => { console.log('Subscriber A', x) }); sub.next(2); // OUTPUT => Subscriber A 2 sub.subscribe(x => { console.log('Subscriber B', x) }); sub.next(3); // Subscriber A 2 // Subscriber A 3 // Subscriber B 3

rxjs6 Conditional and Boolean Operators & Mathematical and Aggregate Operators

牧云@^-^@ 提交于 2020-02-27 12:43:14
Conditional and Boolean Operators defaultIfEmpty 如果源流在结束时没有发出一个值, 则发出一个默认值 const {of} = require('rxjs') const {defaultIfEmpty} = require('rxjs/operators') of(1, 2, 3).pipe( defaultIfEmpty('abc') ).subscribe(console.log) of().pipe( defaultIfEmpty('abc') ).subscribe(console.log) every 类似数组, 返回值为流中的数据是否都满足某个条件 const {of} = require('rxjs') const {every} = require('rxjs/operators') const source$ = of(1, 2, 3) source$.pipe( every(x => x < 5) ).subscribe(console.log) // true source$.pipe( every(x => x % 2) ).subscribe(console.log) // false find & findIndex 返回第一个满足条件的值/位置, 第一个参数为比较函数,

rxjs6 Creation Operators

岁酱吖の 提交于 2020-02-27 12:23:16
Creation Operators 常用于创建Observable ajax 有三种形式, 原生, json, 和使用object自定义header const url = `https://api.github.com/users?per_page=5` ajax(url).pipe( map(userResponse => console.log('users resp: ', userResponse)), catchError(error => { console.log('error: ', error); return of(error); }) ).subscribe() ajax.getJSON(url).pipe( map(userResponse => console.log('users json: ', userResponse)), catchError(error => { console.log('error: ', error); return of(error); }) ).subscribe() ajax({ url: 'https://httpbin.org/delay/2', method: 'POST', headers: { 'Content-Type': 'application/json', 'rxjs-custom-header'

nodejs 异步io加速3倍

旧城冷巷雨未停 提交于 2020-02-27 04:58:05
简化需求 需要读取很多文件, 将其中内容读出后, 获取所有文件内容总长度 数据表现有一些波动是因为笔记本电压或后台影响, 但是优化效果是一致的 将2500ms的任务优化到400ms左右 最简单的同步读 function getLen(x) { return fs.readFileSync(path.join(root, x, x + '.json'), 'utf8').length } function run() { let st = +new Date() let sum = names.reduce( (pre, cur) => pre + getLen(cur) , 0 ) console.log(+new Date() - st, sum) } for (let i = 0; i < 10; i++) run() 两万个文件, 基本上都是2500ms 2860 18423803 2516 18423803 2501 18423803 2513 18423803 2502 18423803 2525 18423803 2478 18423803 2490 18423803 2586 18423803 2610 18423803 简单单个异步 迭代器和rxjs使用异步读, 能快30% 左右, 使用异步的文件时, 有文件数目的最大限制,

Angular组件之间通信

痞子三分冷 提交于 2020-02-27 04:12:42
组合通信分为很多种; 父向子(数据绑定)(@Input()) 子向父(事件监听)(EventEmitter) 通过公共服务(使用 rxjs) 特别需要注意: 这个公共服务需要在同一个注册器下,比如在root注册器下,如果不在可能会出现订阅不到的问题 // 服务 @Injectable({providedIn: 'root'}) export class IndexTitleService { _title = new Subject<string>(); _describe = new Subject<string>(); titleSubscribe = this._title.asObservable(); describeSubscribe = this._describe.asObservable(); constructor() { } changeTitle(title: string) { this._title.next(title); } changeDescribe(des: string) { this._describe.next(des); } } // A组件 产生变化 constructor(private titleService: IndexTitleService) { titleService.changeTitle('欢迎'); } //