首页 文章

RXJS:根据可观察到的值发出额外 Value

提问于
浏览
0

我是RxJs 6.0(或任何RxJs版本)的新手,虽然我看到它有多强大,但是一些简单的概念让我感到震惊 .

我有一种情况,我想根据源流向输出流中发出额外的值,但对于我的生活,我无法弄清楚如何做到这一点 . 我真的需要一个可以采用方法而不是静态值的startsWith运算符然后我可以实现这一点 . 这是一些设置场景的愚蠢代码 .

import { startWith, scan, tap, mergeMap, map, concat } from 'rxjs/operators';

interface IData {
  data: number;
  emitExtraVal: boolean;
}

class obsData implements IData {
  constructor(data: number) {
    this.data = data;
    this.emitExtraVal = false;
  }
  public data: number;
  public emitExtraVal: boolean;

}

class extraData implements IData {
  constructor(data: number) {
    this.data = data;
    this.emitExtraVal = true;
  }

  public data: number;
  public emitExtraVal: boolean;
}
const sourceOne = of(new obsData(1),new obsData(2),new obsData(3));
/*const finalSource = sourceOne.pipe(
  map((sData) => <IData>new extraData(sData.data)),
  map((sData) => sData)
);*/
const finalSource = sourceOne.pipe(
  mergeMap((sData) => concat(of(<IData>new extraData(sData.data), of(sData))))
);
const subscribe = finalSource.subscribe(val => console.log('Data:' + val.emitExtraVal));

我想要做的是输出一个extraData实例,其中包含obsData中的数字,后跟我刚从源中获取的obsData . 这不是我正在尝试的确切场景,但它演示了我正在尝试做的核心,即创建一个额外的输出,然后是另一个输出,两者都依赖于单个源输入 .

This updated example of the problem is based on comments, however this example won't run because the syntax is not correct

这会产生以下错误:

你提供了'function(source){return source.lift.call(concat_1.concat.apply(void 0,[source] .concat(observables))); }'预计会有一个流 . 您可以提供Observable,Promise,Array或Iterable .

---Update--- 这是最后的答案,感谢回应 . 我遇到的主要问题是你可以从rxjs /运算符或rxjs导入concat . 如果在管道命令中使用它,必须从rxjs导入它 .

// RxJS v6+
import { of, fromEvent, combineLatest, concat } from 'rxjs';
import { startWith, scan, tap, mergeMap, map } from 'rxjs/operators';

interface IData {
  data: number;
  emitExtraVal: boolean;
}

class obsData implements IData {
  constructor(data: number) {
    this.data = data;
    this.emitExtraVal = false;
  }
  public data: number;
  public emitExtraVal: boolean;

}

class extraData implements IData {
  constructor(data: number) {
    this.data = data;
    this.emitExtraVal = true;
  }

  public data: number;
  public emitExtraVal: boolean;
}
const sourceOne = of(new obsData(1),new obsData(2),new obsData(3));

const finalSource = sourceOne.pipe(
  mergeMap((sData) => concat(of(<IData>new extraData(sData.data), <IData>sData)))
);
const subscribe = finalSource.subscribe(val => console.log('Data:' + val.emitExtraVal));

1 回答

  • 0

    创建一个额外的输出,然后是另一个输出,两者都依赖于单个源输入 .

    在我的示例中,dataItem是"single source input",它使用 from 运算符转换为它的Observable元素 . 之后您可以使用flattening operators(如mergeMapconcatMap,具体取决于要求)将_1183173_所有这些Observables合并为一个 . 看例子:

    const { Observable, of, from, concat } = rxjs; // = require("rxjs")
    const { mergeMap } = rxjs.operators; // = require("rxjs/operators")
    
    const complexAjaxCall = id => of(`${id}-from-ajax`);
    
    const ids = [1, 2, 3];
    
    from(ids).pipe(
      mergeMap(id => concat(
        complexAjaxCall(id),
        of(id)
      )),
    ).subscribe(e => console.log(e));
    
    <script src="https://unpkg.com/rxjs@6.2.2/bundles/rxjs.umd.min.js"></script>
    

相关问题