• concatAll
    • 签名: concatAll(): Observable
  • 收集 observables,当前一个完成时订阅下一个。
    • 示例
      • 示例 1: 使用 observable 来进行 concatAll
      • 示例 2: 使用 promise 来进行 concatAll
      • 示例 3: 当内部 observables 完成时进行延迟
  • 相关食谱
  • 其他资源

    concatAll

    签名: concatAll(): Observable

    收集 observables,当前一个完成时订阅下一个。


    :warning: 当源 observable 发出的速度要比内部 observables 完成更快时,请小心 backpressure (背压) !

    :bulb: 在很多情况下,你可以使用只使用单个操作符 concatMap 来替代!

    译者注:concatMap === map + concatAll


    concatAll - 图3

    示例

    ( 示例测试 )

    示例 1: 使用 observable 来进行 concatAll

    ( StackBlitz |
    jsBin |
    jsFiddle )

    1. import { map, concatAll } from 'rxjs/operators';
    2. import { of } from 'rxjs/observable/of';
    3. import { interval } from 'rxjs/observable/interval';
    4. // 每2秒发出值
    5. const source = interval(2000);
    6. const example = source.pipe(
    7. // 为了演示,增加10并作为 observable 返回
    8. map(val => of(val + 10)),
    9. // 合并内部 observables 的值
    10. concatAll()
    11. );
    12. // 输出: 'Example with Basic Observable 10', 'Example with Basic Observable 11'...
    13. const subscribe = example.subscribe(val =>
    14. console.log('Example with Basic Observable:', val)
    15. );
    示例 2: 使用 promise 来进行 concatAll

    ( StackBlitz |
    jsBin |
    jsFiddle )

    1. import { map, concatAll } from 'rxjs/operators';
    2. import { interval } from 'rxjs/observable/interval';
    3. // 创建并解析一个基础的 promise
    4. const samplePromise = val => new Promise(resolve => resolve(val));
    5. // 每2秒发出值
    6. const source = interval(2000);
    7. const example = source.pipe(
    8. map(val => samplePromise(val)),
    9. // 合并解析过的 promise 的值
    10. concatAll()
    11. );
    12. // 输出: 'Example with Promise 0', 'Example with Promise 1'...
    13. const subscribe = example.subscribe(val =>
    14. console.log('Example with Promise:', val)
    15. );
    示例 3: 当内部 observables 完成时进行延迟

    ( StackBlitz |
    jsBin |
    jsFiddle )

    1. import { take, concatAll } from 'rxjs/operators';
    2. import { interval } from 'rxjs/observable/interval';
    3. import { of } from 'rxjs/observable/of';
    4. const obs1 = interval(1000).pipe(take(5));
    5. const obs2 = interval(500).pipe(take(2));
    6. const obs3 = interval(2000).pipe(take(1));
    7. // 发出3个 observables
    8. const source = of(obs1, obs2, obs3);
    9. // 按顺序订阅每个内部 obserable,前一个完成了再订阅下一个
    10. const example = source.pipe(concatAll());
    11. /*
    12. 输出: 0,1,2,3,4,0,1,0
    13. 怎么运行的...
    14. 订阅每个内部 observable 并发出值,当一个完成了才订阅下一个
    15. obs1: 0,1,2,3,4 (complete)
    16. obs2: 0,1 (complete)
    17. obs3: 0 (complete)
    18. */
    19. const subscribe = example.subscribe(val => console.log(val));

    相关食谱

    • 进度条

    其他资源

    • concatAll :newspaper: - 官方文档
    • 使用 RxJS 的 concatAll 来打平高阶 observable :video_camera: :dollar: - André Staltz

    :file_folder: 源码: https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/concatAll.ts