From 0db39163b7e60e4877c5c0db7fe06fcae9d8c251 Mon Sep 17 00:00:00 2001 From: "SangKa.Z" Date: Thu, 12 Apr 2018 09:44:54 +0800 Subject: [PATCH] docs(i18n-zh): translate combination operators --- src/i18n/zh/combination/combineAll.ts | 74 +++++++++++ src/i18n/zh/combination/combineLatest.ts | 78 ++++++++++++ src/i18n/zh/combination/concat.ts | 109 +++++++++++++++++ src/i18n/zh/combination/concatAll.ts | 69 +++++++++++ src/i18n/zh/combination/forkJoin.ts | 142 ++++++++++++++++++++++ src/i18n/zh/combination/index.ts | 27 ++++ src/i18n/zh/combination/merge.ts | 87 +++++++++++++ src/i18n/zh/combination/mergeAll.ts | 84 +++++++++++++ src/i18n/zh/combination/pairwise.ts | 53 ++++++++ src/i18n/zh/combination/race.ts | 6 + src/i18n/zh/combination/startWith.ts | 25 ++++ src/i18n/zh/combination/withLatestFrom.ts | 52 ++++++++ src/i18n/zh/combination/zip.ts | 6 + 13 files changed, 812 insertions(+) create mode 100644 src/i18n/zh/combination/combineAll.ts create mode 100644 src/i18n/zh/combination/combineLatest.ts create mode 100644 src/i18n/zh/combination/concat.ts create mode 100644 src/i18n/zh/combination/concatAll.ts create mode 100644 src/i18n/zh/combination/forkJoin.ts create mode 100644 src/i18n/zh/combination/index.ts create mode 100644 src/i18n/zh/combination/merge.ts create mode 100644 src/i18n/zh/combination/mergeAll.ts create mode 100644 src/i18n/zh/combination/pairwise.ts create mode 100644 src/i18n/zh/combination/race.ts create mode 100644 src/i18n/zh/combination/startWith.ts create mode 100644 src/i18n/zh/combination/withLatestFrom.ts create mode 100644 src/i18n/zh/combination/zip.ts diff --git a/src/i18n/zh/combination/combineAll.ts b/src/i18n/zh/combination/combineAll.ts new file mode 100644 index 00000000..792a83e9 --- /dev/null +++ b/src/i18n/zh/combination/combineAll.ts @@ -0,0 +1,74 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const combineAll: OperatorDoc = { + name: 'combineAll', + operatorType: 'combination', + signature: 'public combineAll(project: function): Observable', + parameters: [ + { + name: 'project', + type: 'function', + attribute: '可选的', + description: `将每个内部 Observable 的最新值映射成一个新结果的可选函数。 + 按顺序将每个收集到的内部 Observable 中接收最新值作为参数。` + } + ], + marbleUrl: 'http://reactivex.io/rxjs/img/combineAll.png', + shortDescription: { + description: `当高阶 Observable 完成时,通过使用 combineLatest 将其打平。`, + extras: [] + }, + walkthrough: { + description: ` +

+ 接受一个返回 Observables 的 Observable, 并从中收集所有的 Observables 。 + 一旦最外部的 Observable 完成, 会订阅所有收集带的 Observables, + 然后通过 combineLatest 的策略来合并值, + 规则如下: +

+ + ` + }, + examples: [ + { + name: + '将两个点击事件映射为有限的 interval Observable,然后应用 combineAll', + code: ` + import { map, combineAll, take } from 'rxjs/operators'; + import { fromEvent } from 'rxjs/observable/fromEvent'; + + const clicks = fromEvent(document, 'click'); + const higherOrder = clicks.pipe( + map(ev => + interval(Math.random()*2000).pipe(take(3)) + ), + take(2) + ); + const result = higherOrder.pipe( + combineAll() + ); + result.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/peparawuvo/1/embed?js,console,output' + } + } + ], + relatedOperators: ['combineLatest', 'mergeAll'], + additionalResources: [] +}; diff --git a/src/i18n/zh/combination/combineLatest.ts b/src/i18n/zh/combination/combineLatest.ts new file mode 100644 index 00000000..41d7f020 --- /dev/null +++ b/src/i18n/zh/combination/combineLatest.ts @@ -0,0 +1,78 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const combineLatest: OperatorDoc = { + name: 'combineLatest', + operatorType: 'combination', + signature: + 'public combineLatest(observables: ...Observable, project: function): Observable', + useInteractiveMarbles: true, + parameters: [ + { + name: 'other', + type: 'Observable', + attribute: '', + description: '将要和源 Observable 结合的输入 Observable。可以传入多个。' + }, + { + name: 'project', + type: 'function', + attribute: '可选的', + description: '可选的投射函数,将输出 Observable 返回的值投射为要发出的新的值。' + } + ], + marbleUrl: 'http://reactivex.io/rxjs/img/combineLatest.png', + shortDescription: { + description: ` + 组合多个 Observables 来创建一个 Observable ,该 Observable 的值 + 根据每个输入 Observable 的最新值计算得出的。 + `, + extras: [ + { + type: 'Tip', + text: ` + 注意: 只有当所有源 Observables 都至少发出一次值后,combineLatest 才会开始发出值。 + 通过使用 startWith + 来为源 Observable 添加一个默认值,combineLatest 则会立即生效。 + ` + } + ] + }, + walkthrough: { + description: ` +

+ combineLatest 组合传入的多个 Observables 。 + 通过顺序的订阅每个输入 Observable, 在每次任意输入 Observables 发出值时,收集每个 + 输入 Observables 的最新值并组成一个数组, 然后要么将这个数组传给可选的投射函数并发 + 出投射函数返回的结果, 或者在没有提供投射函数时仅仅发出该数组。 +

+ ` + }, + examples: [ + { + name: '根据身高的 Observable 和体重的 Observable 来动态地计算 BMI 指数', + code: ` + import { combineLatest } from 'rxjs/operators; + import { of } from 'rxjs/observable/of'; + + const weight = of(70, 72, 76, 79, 75); + const height = of(1.76, 1.77, 1.78); + const bmi = weight.pipe( + combineLatest(height, (w, h) => w / (h * h)) + ); + /* + 输出: + BMI is 24.212293388429753 + BMI is 23.93948099205209 + BMI is 23.671253629592222 + */ + bmi.subscribe(x => console.log('BMI is ' + x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/pivowunedu/1/embed?js,console' + } + } + ], + relatedOperators: ['combineAll', 'merge', 'withLatestFrom'], + additionalResources: [] +}; diff --git a/src/i18n/zh/combination/concat.ts b/src/i18n/zh/combination/concat.ts new file mode 100644 index 00000000..f7f9f2ec --- /dev/null +++ b/src/i18n/zh/combination/concat.ts @@ -0,0 +1,109 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const concat: OperatorDoc = { + name: 'concat', + operatorType: 'combination', + signature: + 'public static concat(input1: ObservableInput, input2: ObservableInput, scheduler: Scheduler): Observable', + parameters: [ + { + name: 'input1', + type: 'ObservableInput', + attribute: '', + description: '可以与其他 Observable 连接的输入 Observable 。' + }, + { + name: 'input2', + type: 'ObservableInput', + attribute: '', + description: '可以与其他 Observable 连接的输入 Observable 。可以接收多个输入 Observable。' + }, + { + name: 'scheduler', + type: 'Scheduler', + attribute: '可选的,默认值: null', + description: '可选的调度器,控制每个输入 Observable 的订阅。' + } + ], + marbleUrl: 'http://reactivex.io/rxjs/img/concat.png', + shortDescription: { + description: '创建一个输出 Observable,它按顺序发出每个给定的输入 Observable 中的所有值。', + extras: [ + { + type: 'Tip', + text: '通过顺序地发出多个 Observables 的值来将它们一个接一个的连接起来。' + } + ] + }, + walkthrough: { + description: ` +

concat 通过一次订阅一个将多个 Observables 连接起来,并将值合并到输出 Observable 中。 + 你可以传递一个输入 Observable 数组,或者直接把它们当做参数传递。 传递一个空数组会 导致输出 Observable 立马触发完成状态。

+ +

concat 会订阅第一个输入 Observable 并且发出它的所有值, 不去做任何干预。当这个 + 输入 Observable 完成时, 订阅第二个输入 Observable,同样的发出它的所有值。这个过程会不断重复直到输入 Observable 都用过了。 + 当最后一个输入 Observable 完成时,concat 也会完成。 任何时刻都只会有一个输入 Observable 发出值。 + 如果你想让所有的输入 Observable 并行发出数据,请查看 merge, + 尤其是使用可选的 concurrent 参数。 事实上, concat 和 + concurrentmerge 效果是一样的。

+ +

注意,如果输入 Observable 一直都不完成, concat 也会一直不能完成并且下一个输入 Observable 将 + 永远不能被订阅. 另一方面, 如果某个输入 Observable 在它被订阅后立马处于完成状态, 那么它对 concat 是 + 不可见的, 仅仅会转向下一个输入 Observable 。

+ +

如果输入 Observable 链中的任一成员发生错误, concat 会立马触发错误状态,而不去控制下一个 + 输入 Observable. 发生错误的输入 Observable 之后的输入 Observable 不会被订阅.

+ +

如果你将同一输入 Observable 传递给 concat 多次,结果流会在每次订阅的时候“重复播放”, + 这意味着 你可以重复 Observable 多次. 如果你乏味的给 concat 传递同一输入 Observable 1000次, + 你可以试着用用 repeat

+ ` + }, + examples: [ + { + name: '将从 0 数到 3 的定时器和从 1到 10 的同步序列进行连接', + code: ` + import { take } from 'rxjs/operators'; + import { interval } from 'rxjs/observable/interval'; + import { range } from 'rxjs/observable/range'; + import { concat } from 'rxjs/observable/concat'; + + const timer = interval(1000).pipe(take(4)); + const sequence = range(1, 10); + const result = concat(timer, sequence); + result.subscribe(x => console.log(x)); + + // 结果为: + // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10 + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/doqoyimaxu/embed?js,console' + } + }, + { + name: '连接有 3 个 Observables', + code: ` + import { take, concat } from 'rxjs/operators'; + import { interval } from 'rxjs/observable/interval'; + + const timer1 = interval(1000).pipe(take(10)); + const timer2 = interval(2000).pipe(take(6)); + const timer3 = interval(500).pipe(take(10)); + const result = timer1.pipe(concat(timer2, timer3)); + result.subscribe(x => console.log(x)); + + // 结果如下: + // (按顺序打印到控制台) + // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9 + // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5 + // -500ms-> 0 -500ms-> 1 -500ms-> ... 9 + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/decaromone/1/embed?js,console' + } + } + ], + relatedOperators: ['concatAll', 'concatMap', 'concatMapTo'] +}; diff --git a/src/i18n/zh/combination/concatAll.ts b/src/i18n/zh/combination/concatAll.ts new file mode 100644 index 00000000..f114d20c --- /dev/null +++ b/src/i18n/zh/combination/concatAll.ts @@ -0,0 +1,69 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const concatAll: OperatorDoc = { + name: 'concatAll', + operatorType: 'combination', + signature: 'public concatAll(): Observable', + parameters: [], + marbleUrl: 'http://reactivex.io/rxjs/img/concatAll.png', + shortDescription: { + description: '通过顺序地连接内部 Observable,将高阶 Observable 转化为一阶 Observable 。', + extras: [ + { + type: 'Tip', + text: '通过一个接一个的连接内部 Observable ,将高阶 Observable 打平。' + } + ] + }, + walkthrough: { + description: ` + 串行连接源 (高阶 Observable) 所发出的每个 Observable,只有当一个内部 Observable 完成的时候才订阅下一个 + 内部 Observable,并将它们的所有值合并到返回的 Observable 中。 + `, + extras: [ + { + type: 'Warning', + text: ` + 如果源 Observable 很快并且不停地发送 Observables, 内部 Observables 完成速度比源 Observable 的发出速度慢, + 你会遇到内存问题,因为传入的 Observables 在无限制的缓冲区中进行收集的。 + ` + }, + { + type: 'Tip', + text: `concatAll 等价于 concurrency 参数(最大并发数)为 1 的 mergeAll 。` + } + ] + }, + examples: [ + { + name: '每次点击都会触发从 0 到 3 的定时器 (时间间隔为 1 秒),定时器之间是串行的', + code: ` + import { map, take, concatAll } from 'rxjs/operators'; + import { fromEvent } from 'rxjs/observable/fromEvent'; + import { interval } from 'rxjs/observable/interval'; + + const clicks = fromEvent(document, 'click'); + const higherOrder = clicks.pipe( + map(ev => interval(1000).pipe(take(4))) + ); + const firstOrder = higherOrder.pipe(concatAll()); + firstOrder.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/guhefeyahi/embed?js,console,output' + } + } + ], + relatedOperators: [ + 'combineAll', + 'concat', + 'concatMap', + 'concatMapTo', + 'exhaust', + 'mergeAll', + 'switch', + 'zipAll' + ], + additionalResources: [] +}; diff --git a/src/i18n/zh/combination/forkJoin.ts b/src/i18n/zh/combination/forkJoin.ts new file mode 100644 index 00000000..64e3e673 --- /dev/null +++ b/src/i18n/zh/combination/forkJoin.ts @@ -0,0 +1,142 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const forkJoin: OperatorDoc = { + name: 'forkJoin', + operatorType: 'combination', + signature: 'public static forkJoin(sources: *): any', + parameters: [ + { + name: 'sources', + type: '*', + attribute: '', + description: '' + } + ], + marbleUrl: 'http://reactivex.io/rxjs/img/forkJoin.png', + shortDescription: { + description: '将传入的 Observables 的最新值组合起来。', + extras: [ + { + type: 'Tip', + text: '等待所有 Observables 都完成后将它们的发出的最新值组合起来。' + } + ] + }, + walkthrough: { + description: ` +

+ forkJoin 操作符接收任意数量的 Observables, + 这些 Observables 可以作为数组传入,也可以作为单个参数传入。如果没有提供输入 Observable, + 那么结果流将立即完成。 +

+

+ forkJoin 会等待所有传入的 Observables 都完成后, + 它才会发出一个数组,数组的值与传入的 Observable 的最新值是一一对应的。比如,你传入了 “n” 个 + Observables,那么结果数组也将有 “n” 个值,值的顺序与 Observables 的顺序是一一对应的。 + 这意味着 forkJoin 最多只会发出一次值,然后便完成。 + 如果你需要的不止是在传入的 Observables 生命周期结束后将组合值发出,而是贯穿整个生命周期, + 可以试试 combineLatest + 或 zip 。 +

+

+ 为了使结果数组的长度与输入 Observable 的个数保持一直,每当任意 Observable 完成却没有发出任何值时, + forkJoin 会立即完成,并且不会发出任何值,即使其他 Observables + 已经发出值了。 +

+ +

+ 相反地,如果某个 Observable 永远都不会完成,那么 forkJoin 也 + 永远都无法完成,除非某个时间点其他 Observable 在未发出任何值的情况下完成了,这将回到上一个场景。 + 总之,要想使 forkJoin 发出值,那么所有传入的 Observables 都 + 必须至少发出一次值之后再完成。 +

+

+ 如果某个时间点任意输入 Observable 报错的话,forkJoin 同样 + 也会报错,所有其他的 Observables 都会被立即取消订阅。 +

+

+ forkJoin 还可以选择接收投射函数,通常都是使用发出的数组作为参数来调用 + 此函数。无论投射函数返回值是什么,都将出现在输出 Observable 中。这意味着可以将默认的投射函数想象成这样的函数, + 它接收所有参数并将它们放入一个数组中。注意,仅当输出 Observable 应该发出结果时才会调用投射函数。 +

+ ` + }, + examples: [ + { + name: 'forkJoin 和同步发出值的操作符一起使用', + code: ` + import { forkJoin } from 'rxjs/observable/forkJoin'; + import { of } from 'rxjs/observable/of'; + + const observable = forkJoin( + of(1, 2, 3, 4), + of(5, 6, 7, 8) + ); + observable.subscribe( + value => console.log(value), + err => {}, + () => console.log('This is how it ends!') + ); + // 输出: + // [4, 8] + // "This is how it ends!" + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/kinilaruki/1/embed?js,console' + } + }, + { + name: 'forkJoin 和异步发出值的操作符一起使用', + code: ` + import { take } from 'rxjs/operators'; + import { forkJoin } from 'rxjs/observable/forkJoin'; + import { interval } from 'rxjs/observable/interval'; + + const observable = forkJoin( + interval(1000).pipe(take(3)), // 每隔 1 秒发出 0, 1, 2 然后完成 + interval(500).pipe(take(4)) // 每隔半秒发出 0, 1, 2, 3 然后完成 + ); + observable.subscribe( + value => console.log(value), + err => {}, + () => console.log('This is how it ends!') + ); + // 输出: + // [2, 3] + // 3 秒后 + // 紧接着 + // "This is how it ends!" + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/rewivubuqi/1/embed?js,console' + } + }, + { + name: '使用带投射函数的 forkJoin', + code: ` + const observable = Rx.Observable.forkJoin( + Rx.Observable.interval(1000).take(3), // 每隔 1 秒发出 0, 1, 2 然后完成 + Rx.Observable.interval(500).take(4), // 每隔半秒发出 0, 1, 2, 3 然后完成 + (n, m) => n + m + ); + observable.subscribe( + value => console.log(value), + err => {}, + () => console.log('This is how it ends!') + ); + // 输出: + // 3秒后 + // 5 + // 紧接着 + // "This is how it ends!" + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/wayomumike/1/embed?js,console' + } + } + ], + relatedOperators: ['combineLatest', 'zip'] +}; diff --git a/src/i18n/zh/combination/index.ts b/src/i18n/zh/combination/index.ts new file mode 100644 index 00000000..5f5ce530 --- /dev/null +++ b/src/i18n/zh/combination/index.ts @@ -0,0 +1,27 @@ +import { combineAll } from './combineAll'; +import { combineLatest } from './combineLatest'; +import { concat } from './concat'; +import { concatAll } from './concatAll'; +import { forkJoin } from './forkJoin'; +import { merge } from './merge'; +import { mergeAll } from './mergeAll'; +import { pairwise } from './pairwise'; +import { race } from './race'; +import { startWith } from './startWith'; +import { withLatestFrom } from './withLatestFrom'; +import { zip } from './zip'; + +export const COMBINATION_OPERATORS = [ + combineAll, + combineLatest, + concat, + concatAll, + forkJoin, + merge, + mergeAll, + pairwise, + race, + startWith, + withLatestFrom, + zip +]; diff --git a/src/i18n/zh/combination/merge.ts b/src/i18n/zh/combination/merge.ts new file mode 100644 index 00000000..3fc77ab0 --- /dev/null +++ b/src/i18n/zh/combination/merge.ts @@ -0,0 +1,87 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const merge: OperatorDoc = { + name: 'merge', + operatorType: 'combination', + signature: + 'public merge(other: ObservableInput, concurrent: number, scheduler: Scheduler): Observable', + parameters: [ + { + name: 'other', + type: 'ObservableInput', + attribute: '', + description: `可以与源 Observable 合并的输入 Observable 。 可以给定多个输入 Observables 作为参数。` + }, + { + name: 'concurrent', + type: 'number', + attribute: '可选的, 默认值: Number.POSITIVE_INFINITY', + description: `可以同时订阅的输入 Observables 的最大数量。` + }, + { + name: 'scheduler', + type: 'Scheduler', + attribute: '可选的,默认值: null', + description: `用来管理输入 Observables 的并发性的调度器。` + } + ], + marbleUrl: 'http://reactivex.io/rxjs/img/merge.png', + shortDescription: { + description: `创建一个输出 Observable ,它可以同时发出每个给定的输入 Observable 中值。`, + extras: [ + { + type: 'Tip', + text: '通过把多个 Observables 的值混合到一个 Observable 中来将其打平。' + } + ] + }, + walkthrough: { + description: ` +

+ merge 订阅每个给定的输入 Observable (作为参数), + 然后只是将所有输入 Observables 的所有值发 送(不进行任何转换)到输出 Observable 。所有 + 的输入 Observable 都完成了,输出 Observable 才 能完成。任何由输入 Observable 发出的 + 错误都会立即在输出 Observalbe 上发出。 +

+ ` + }, + examples: [ + { + name: '合并两个 Observables: 时间间隔为 1 秒的 timer 和 clicks', + code: ` + import { merge } from 'rxjs/operators'; + import { fromEvent } from 'rxjs/observable/fromEvent'; + import { interval } from 'rxjs/observable/interval'; + + const clicks = fromEvent(document, 'click'); + const timer = interval(1000); + const clicksOrTimer = clicks.pipe(merge(timer)); + clicksOrTimer.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/wihafapiva/1/embed?js,output' + } + }, + { + name: '合并三个 Observables ,但只能同时运行两个', + code: ` + import { take } from 'rxjs/operators'; + import { merge } from 'rxjs/observable/merge'; + import { interval } from 'rxjs/observable/interval'; + + const timer1 = interval(1000).pipe(take(10)); + const timer2 = interval(2000).pipe(take(6)); + const timer3 = interval(500).pipe(take(10)); + const concurrent = 2; // 参数 + const merged = timer1.pipe(merge(timer2, timer3, concurrent)); + merged.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/midosuqaga/1/embed?js,output' + } + } + ], + relatedOperators: ['mergeAll', 'mergeMap', 'mergeMapTo', 'mergeScan'] +}; diff --git a/src/i18n/zh/combination/mergeAll.ts b/src/i18n/zh/combination/mergeAll.ts new file mode 100644 index 00000000..56bec20b --- /dev/null +++ b/src/i18n/zh/combination/mergeAll.ts @@ -0,0 +1,84 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const mergeAll: OperatorDoc = { + name: 'mergeAll', + operatorType: 'combination', + signature: 'public mergeAll(concurrent: number): Observable', + parameters: [ + { + name: 'concurrent', + type: 'number', + attribute: '可选的,默认值: Number.POSITIVE_INFINITY', + description: `可以同时订阅的输入 Observables 的最大数量。` + } + ], + marbleUrl: 'http://reactivex.io/rxjs/img/mergeAll.png', + shortDescription: { + description: `将高阶 Observable 转换成一阶 Observable ,一阶 Observable 会同时发出在内部 Observables 上发出的所有值。`, + extras: [ + { + type: 'Tip', + text: '打平高阶 Observable 。' + } + ] + }, + walkthrough: { + description: ` +

+ mergeAll 订阅发出 Observables 的 Observalbe ,也称为 + 高阶 Observable 。每当观察到发出的内部 Observable 时,它会订阅并发出输出 Observable 上的这个 + 内部 Observable 的所有值。所有的内部 Observable 都完成了,输出 Observable 才能完成。任何由\ + 内部 Observable 发出的错误都会立即在输出 Observalbe 上发出。 +

+ ` + }, + examples: [ + { + name: '为每个点击事件创建一个新的 interval Observable ,并将其输出混合为一个 Observable', + code: ` + import { mergeAll, map } from 'rxjs/operators'; + import { fromEvent } from 'rxjs/observable/fromEvent'; + import { interval } from 'rxjs/observable/interval'; + + const clicks = fromEvent(document, 'click'); + const higherOrder = clicks.pipe(map((ev) => interval(1000))); + const firstOrder = higherOrder.pipe(mergeAll()); + firstOrder.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/lebidefocu/1/embed?js,output' + } + }, + { + name: '每次点击都会从 0 到 9 计数(每秒计数一次),但只允许最多同时只能有两个计时器', + code: ` + import { mergeAll, map } from 'rxjs/operators'; + import { fromEvent } from 'rxjs/observable/fromEvent'; + import { interval } from 'rxjs/observable/interval'; + + const clicks = fromEvent(document, 'click'); + const higherOrder = clicks.pipe( + map((ev) => interval(1000).pipe(take(10))) + ); + const firstOrder = higherOrder.pipe(mergeAll(2)); + firstOrder.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/kokezoribu/embed?js,output' + } + } + ], + relatedOperators: [ + 'combineAll', + 'concatAll', + 'exhaust', + 'merge', + 'mergeMap', + 'mergeMapTo', + 'mergeScan', + 'switch', + 'zipAll' + ] +}; diff --git a/src/i18n/zh/combination/pairwise.ts b/src/i18n/zh/combination/pairwise.ts new file mode 100644 index 00000000..253891f5 --- /dev/null +++ b/src/i18n/zh/combination/pairwise.ts @@ -0,0 +1,53 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const pairwise: OperatorDoc = { + name: 'pairwise', + operatorType: 'combination', + marbleUrl: 'http://reactivex.io/rxjs/img/pairwise.png', + signature: 'public pairwise(): Observable>', + shortDescription: { + description: '将一系列连续的发送成对的组合在一起,并将这些分组作为两个值的数组发出。', + extras: [ + { + type: 'Tip', + text: '将当前值和前一个值作为数组放在一起,然后将其发出。' + } + ] + }, + walkthrough: { + description: ` +

+ 源 Observable 的第 N 个发送会使输出 Observable 发出一个数组 [(N-1)th, Nth],即前一个 + 值和当前值的数组,它们作为一对。出于这个原因,pairwise 发出源 Observable 的 第二个和随 + 后的发送,而不发送第一个,因为它没有前一个值。 +

+ ` + }, + examples: [ + { + name: '每次点击 (从第二次开始),都会发出与前一次点击的相对距离', + code: ` + import { pairwise, map } from 'rxjs/operators'; + import { fromEvent } from 'rxjs/observable/fromEvent'; + + const clicks = fromEvent(document, 'click'); + const pairs = clicks.pipe(pairwise()); + const distance = pairs.pipe( + map(pair => { + const x0 = pair[0].clientX; + const y0 = pair[0].clientY; + const x1 = pair[1].clientX; + const y1 = pair[1].clientY; + return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2)); + }) + ); + distance.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/wenazagegu/embed?js,console,output' + } + } + ], + relatedOperators: ['buffer', 'bufferCount'] +}; diff --git a/src/i18n/zh/combination/race.ts b/src/i18n/zh/combination/race.ts new file mode 100644 index 00000000..b22c2f1c --- /dev/null +++ b/src/i18n/zh/combination/race.ts @@ -0,0 +1,6 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const race: OperatorDoc = { + name: 'race', + operatorType: 'combination' +}; diff --git a/src/i18n/zh/combination/startWith.ts b/src/i18n/zh/combination/startWith.ts new file mode 100644 index 00000000..47ef98dd --- /dev/null +++ b/src/i18n/zh/combination/startWith.ts @@ -0,0 +1,25 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const startWith: OperatorDoc = { + name: 'startWith', + operatorType: 'combination', + marbleUrl: 'http://reactivex.io/rxjs/img/startWith.png', + signature: 'public startWith(values: ...T, scheduler: Scheduler): Observable', + shortDescription: { + description: '返回的 Observable 会先发出作为参数指定的项,然后再发出由源 Observable 所发出的项。' + }, + parameters: [ + { + name: 'values', + type: '...T', + attribute: '', + description: '想要 Observable 发出的第一个值。' + }, + { + name: 'scheduler', + type: 'Scheduler', + attribute: '可选的', + description: '用于调度 next 通知发送的调度器。' + } + ] +}; diff --git a/src/i18n/zh/combination/withLatestFrom.ts b/src/i18n/zh/combination/withLatestFrom.ts new file mode 100644 index 00000000..1fe24a4d --- /dev/null +++ b/src/i18n/zh/combination/withLatestFrom.ts @@ -0,0 +1,52 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const withLatestFrom: OperatorDoc = { + name: 'withLatestFrom', + operatorType: 'combination', + signature: + 'public withLatestFrom(other: ObservableInput, project: Function): Observable', + marbleUrl: 'http://reactivex.io/rxjs/img/withLatestFrom.png', + shortDescription: { + description: ` + 组合源 Observable 和另外的 Observables 以创建输出 Observable,只有当源 Observable 发出值的时,输出 Observable 的值 + 才会根据每个 Observable 最新的值计算得出,。 + `, + extras: [ + { + type: 'Tip', + text: `每当源 Observable 发出值时,它会进行公式计算,此公式使用该值加上其他输入 Observable 的最新值,然后发出公式的输出结果。` + } + ] + }, + walkthrough: { + description: ` +

+ withLatestFrom 组合源 Observablecombines(实例)和其他输入 Observables 的最新值, + 当且仅当源 Observable 发出数据时, 可选的使用 project 函数以决定输出 Observable 将要发出的值。 在输出 Observable 发出值 + 之前,所有的输入 Observables 都必须发出至少一个值。 +

+ ` + }, + examples: [ + { + name: '对于每次点击,启动时间间隔为 1 秒的定时器,只发出 0 到 3 的值,而且没有并发', + code: ` + import { take, concatAll, map } from 'rxjs/operators'; + import { fromEvent } from 'rxjs/observable/fromEvent'; + import { interval } from 'rxjs/observable/interval'; + + const clicks = fromEvent(document, 'click'); + const higherOrder = clicks.pipe( + map(ev => interval(1000).pipe(take(4))) + ); + const firstOrder = higherOrder.pipe(concatAll()); + firstOrder.subscribe(x => console.log(x)); + `, + externalLink: { + platform: 'JSBin', + url: 'http://jsbin.com/wojoqenitu/1/embed?js,console,output' + } + } + ], + relatedOperators: ['combineLatest'] +}; diff --git a/src/i18n/zh/combination/zip.ts b/src/i18n/zh/combination/zip.ts new file mode 100644 index 00000000..9e4b6a48 --- /dev/null +++ b/src/i18n/zh/combination/zip.ts @@ -0,0 +1,6 @@ +import { OperatorDoc } from '../../../operator-docs'; + +export const zip: OperatorDoc = { + name: 'zip', + operatorType: 'combination' +};