美文网首页
[Rxjs] Observable.concat()的使用

[Rxjs] Observable.concat()的使用

作者: V_Jan | 来源:发表于2020-11-12 11:25 被阅读0次

https://rxjs-dev.firebaseapp.com/api/index/function/concat

使用场景:需要同时触发n个请求后端顺序,且要一个个返回结果并处理结果。Promise.all()不合适,因为它要等所有结果都返回了才会返回给前端,这样造成页面等待时间过长,用户体验不佳。比较好的体验结果应该是看到页面上的结果一个个被更新。 犹如jenkins build好多job。看它们一个个build结束。

这个时候就要用到Observable.concat(),这是官网对它的定义。

Creates an output Observable which sequentially emits all values from given Observable and then moves on to the next.
concat<O extends ObservableInput<any>, R>(...observables: (SchedulerLike | O)[]): Observable<ObservedValueOf<O> | R>

concat will subscribe to first input Observable and emit all its values, without changing or affecting them in any way. When that Observable completes, it will subscribe to then next Observable passed and, again, emit its values. This will be repeated, until the operator runs out of Observables.

concat joins multiple Observables together, by subscribing to them one at a time and merging their results into the output Observable. You can pass either an array of Observables, or put them directly as arguments. Passing an empty array will result in Observable that completes immediately.
虽然文档说可以pass an array of Observables, 但实践证明它只收单个observable, 就像这样

Observable.concat(ob1, ob2, ob3).subscribe()

所以,你可以用for 构造一个observable 数组,然后用扩展运算符"..." 把数组打散成一个个变量传给concat.就像这样:

getLastBuild(){
  let observables: Observable<BuildResult>[] = [];
  for (let key of Object.keys(jobGroup)) {
            let jobs = uniq(map(jobGroup[key], 'jenkinsJob'));
            observables.push(service.getJobLastBuild({jobNames: jobs}, key));
   }
  Observable.concat(...observables).subscribe(
            res => {
            //deal with the result one by one
            },
            err=>{},
            ()=>{}
}  

如果你不懂扩展运算符(数组前面的三个点), 可以参考
https://es6.ruanyifeng.com/#docs/array#%E6%89%A9%E5%B1%95%E8%BF%90%E7%AE%97%E7%AC%A6

扩展运算符(spread)是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。

console.log(...[1, 2, 3])
// 1 2 3

console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5

[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

===============额外知识:如果你也用golang===============
golang也用...用于打散slice以便追加到另一个slice上,只是golang是放在变量后面,比如

var allChanges []string
changes:=getChanges()
allChanges=append(allChanges,changes...)

但golang的...不仅仅这个作用,它还用于表达函数有多个不定参数(类型固定了)的情况:

func print(args ...string) { //可以接受任意个string参数
    for _, v:= range args{
        fmt.Println(v)
    }
}

相关文章

  • [Rxjs] Observable.concat()的使用

    https://rxjs-dev.firebaseapp.com/api/index/function/conca...

  • Rxjs 的使用

    RxJS使用分: 前端Html 后端 前端使用方法 前端在Html中将RxJS作为普通Javascript库包引入...

  • react-rxjs-ajax

    react使用rxjs的ajax请求方式

  • Rxjs的使用

    什么是RxJS? RxJS是ReactiveX编程理念的JavaScript版本。ReactiveX来自微软,它是...

  • rxjs 基础概念

    Rxjs 是什么? RxJS 是一个库,它通过使用 observable 序列来编写异步和基于事件的程序。它提供了...

  • ng4.x http数据请求 --- 使用RxJS

    【此例通过Http、Jsonp请求数据 ---- 使用RxJS】 【RxJS:是一种针对异步数据流编程工具,后者叫...

  • rxjs- 03 subject 几种使用和demo实例

    rxjs版本最新的: "rxjs":"^6.3.3" 跟之前导入的方法不一样 现在各种引用直接拿着使用比之前较为方便

  • 用Rxjs的思路来处理PHP的回调地狱

    RxPHP 最近最学习Rxjs,rxjs也叫响应式编程,在React和Angluer2使用的比较广泛,还有一点就是...

  • RxJS介绍

    什么是RxJS RxJS 是一个库,它通过使用 observable 序列来编写异步和基于事件的程序。它提供了一个...

  • 01RxJS-响应式编程类库

    rxjs-响应式编程类库)RxJS官网[https://rxjs.dev/] RxJS(Reactive Exte...

网友评论

      本文标题:[Rxjs] Observable.concat()的使用

      本文链接:https://www.haomeiwen.com/subject/czbubktx.html