Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS Observable.concat:如何知道下一个结果来自哪里?_Javascript_Angularjs_Typescript_Angular_Rxjs - Fatal编程技术网

Javascript RxJS Observable.concat:如何知道下一个结果来自哪里?

Javascript RxJS Observable.concat:如何知道下一个结果来自哪里?,javascript,angularjs,typescript,angular,rxjs,Javascript,Angularjs,Typescript,Angular,Rxjs,我的应用程序(Angular 2和用TypeScript编写的RxJS 5)要求我按预定义顺序对web服务进行两次调用。我决定尝试RxJS observables的concat操作符。问题在于,接收值的onNext回调需要根据值的来源将它们转发到不同的处理程序 我的代码可以简化为: suscription1 = Observable.return({name:'John', age:7}); subscription2 = Observable.return({name:'Mary', colo

我的应用程序(Angular 2和用TypeScript编写的RxJS 5)要求我按预定义顺序对web服务进行两次调用。我决定尝试RxJS observables的
concat
操作符。问题在于,接收值的
onNext
回调需要根据值的来源将它们转发到不同的处理程序

我的代码可以简化为:

suscription1 = Observable.return({name:'John', age:7});
subscription2 = Observable.return({name:'Mary', color:'blue'}); 
Observable.concat(subscription1, subscription2).subscribe(
    data=>{ /* need to know which subscripion 
             i'm dealing with to direct to the right handler*/}
);
确定每次可观测发射数据来源的最优雅的方法是什么?我想到了几种方法,但它们都显得笨拙:

  • 在作用域中保留计数器,可能作为类属性。检查并在每次收到结果时递增。由于每个可见光只发射一次,计数器在第一次订阅输出时有其初始值,在第二次订阅输出时有初始值+1。问题是,当我不知道每个可见物在完成之前会发射多少次时,这就行不通了

  • 检查每个结果,并根据结果的形状确定其来源。例如,在我的示例中,只有第一个可观察的结果具有
    age
    属性。显然,当结果具有相同形状时,这变得不切实际

  • 完全去掉
    concat
    操作符;在
    subscription1
    onComplete
    处理程序中订阅
    subscription2
    。这会起作用,但不能很好地扩展;如果我有4或5个订阅要连接,它将变成嵌套地狱

  • 解决方案3仅包含2个订阅

    suscription1 = Observable.return({name:'John', age:7});
    subscription2 = Observable.return({name:'Mary', age:8}); 
    subscription1.subscribe(
        data=> this.handlerOne(data),
        error=>{},
        ()=> {
            subscription2.subscribe(
                data=>this.handlerTwo(data),
                error=>{},
                ()=>console.log('All subscriptions completed!')
            )
        }
    );
    

    所以我的问题是:当使用
    Observable.concat
    按顺序订阅多个Observable时,我的
    onNext
    处理程序如何确定数据来自何处?或者,我是否应该为此使用另一个操作员?我无法使用
    forkJoin
    运算符,因为订阅完成的顺序很重要。

    您可以
    映射
    订阅以了解它来自何处

    suscription1 = Observable.return({name:'John', age:7})
             .map(person => { person.source = 1; return person };
    subscription2 = Observable.return({name:'Mary', age:8})
             .map(person => { person.source = 2; return person };
    
    然后,您可以轻松确定其来源:

    Observable.concat(subscription1, subscription2).subscribe(
        data=> { if (data.source == 1) /* do whatever */ }
    );
    

    有趣。我认为
    map
    只能在
    subscribe
    之后调用,但显然不能。我对更改
    person
    结果本身感到不舒服,因此我修改了您的建议,添加了一个兄弟属性:
    .map(e=>{return{source:1,result:e}})
    在第二个
    映射中,
    person.source
    的值不应与第一个
    映射中的值相同。你现在把它们都设置为1Woops,是的,这太愚蠢了,谢谢你的更正!