Typescript RXJS:根据传入的可观察值发出额外值

Typescript RXJS:根据传入的可观察值发出额外值,typescript,rxjs,rxjs6,Typescript,Rxjs,Rxjs6,我是RxJs 6.0(或任何RxJs版本)的新手,虽然我看到了它的强大功能,但一些简单的概念让我无法理解 我有这样一种情况,我想根据源流向输出流中发出一个额外的值,但就我的一生而言,我不知道如何做到这一点。我真的需要一个startsWith操作符,它可以采用一个方法而不是静态值,然后我就可以实现这一点。下面是一些设置场景的愚蠢代码 import { startWith, scan, tap, mergeMap, map, concat } from 'rxjs/operators'; inte

我是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));
从'rxjs/operators'导入{startWith,scan,tap,mergeMap,map,concat};
界面IData{
数据:数字;
emitextral:布尔值;
}
类obsData实现IData{
建造师(数据:编号){
这个数据=数据;
this.emitextral=false;
}
公共数据:数字;
公共值:布尔值;
}
类extraData实现IData{
建造师(数据:编号){
这个数据=数据;
this.emitextral=true;
}
公共数据:数字;
公共值:布尔值;
}
const sourceOne=of(新obsData(1)、新obsData(2)、新obsData(3));
/*const finalSource=sourceOne.pipe(
map((sData)=>新的外部数据(sData.data)),
地图((sData)=>sData)
);*/
const finalSource=sourceOne.pipe(
mergeMap((sData)=>concat(of(新的外部数据)(sData.data),of(sData)))
);
const subscribe=finalSource.subscribe(val=>console.log('Data:'+val.emitextralval));
我要做的是输出一个extraData实例,其编号在obsData中,后跟我刚从源代码中获取的obsData。这不是我正在尝试的确切场景,但它演示了我正在尝试做的核心工作,即创建一个额外的输出,然后再创建另一个输出,这两个输出都依赖于单个源输入

此问题的更新示例基于注释,但是此示例不会运行,因为语法不正确

这会产生以下错误:

您提供了“function(source){return source.lift.call(concat_1.concat.apply(void 0[source].concat(observates));}”,其中需要流。您可以提供一个可观察的、承诺的、数组的或可观察的

---更新--- 这是最后的答案,感谢大家的回答。我遇到的主要问题是,您可以从rxjs/operators或rxjs导入concat。如果在pipe命令中使用它,则必须从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));
//rxjsv6+
从“rxjs”导入{of、fromEvent、CombineTest、concat};
从'rxjs/operators'导入{startWith,scan,tap,mergeMap,map};
界面IData{
数据:数字;
emitextral:布尔值;
}
类obsData实现IData{
建造师(数据:编号){
这个数据=数据;
this.emitextral=false;
}
公共数据:数字;
公共值:布尔值;
}
类extraData实现IData{
建造师(数据:编号){
这个数据=数据;
this.emitextral=true;
}
公共数据:数字;
公共值:布尔值;
}
const sourceOne=of(新obsData(1)、新obsData(2)、新obsData(3));
const finalSource=sourceOne.pipe(
mergeMap((sData)=>concat(of(新的外部数据,sData.data,sData)))
);
const subscribe=finalSource.subscribe(val=>console.log('Data:'+val.emitextralval));
创建一个额外的输出,然后再创建另一个输出,这两个输出都依赖于单个源输入

在我的示例中,dataItem是“单源输入”,它使用
from
运算符转换为it元素的可观察值。稍后,您可以使用(类似于或取决于需求)将所有这些可观察的对象“展平”为一个。请参见示例:

const{Observable,of,from,concat}=rxjs;//=要求(“rxjs”)
const{mergeMap}=rxjs.operators;//=要求(“rxjs/操作员”)
const complexAjaxCall=id=>of(`${id}-from ajax`);
常量id=[1,2,3];
从(ID)。管道(
合并映射(id=>concat(
complexAjaxCall(id),
(身份证)
)),
).subscribe(e=>console.log(e))

我认为这接近我想要的。唯一的问题是在我更复杂的场景中,我不只是处理静态值。在from中,如果您需要调用某个api,该api返回一个可观察的,并且您需要该api的返回来添加另一个值,该怎么办。您的示例和我的示例之间的主要区别在于,我的“新数据”来自外部源,而不是传入源。你能以我为例,让它发挥作用吗?我以为康卡特必须一直在管道指挥部。那可能就是我要找的!我将向您报告。当我运行您的示例时,我收到了此错误:错误:您提供了“function(source){return source.lift.call(concat_1.concat.apply(void 0,[source].concat(observates));}”,其中需要流。您可以提供一个可观察的、承诺的、数组的或可观察的。这类似于我在做我正在做的事情时所犯的错误。如果看不到你的改变,我就无能为力。您可能应该使用可复制的代码示例编辑或创建单独的问题(最好在线运行/可编辑)@ChrisHolt确保您从
rxjs
导入
concat
,而不是从
rxjs/操作符导入