Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Typescript 在RxJS中,为满足特定条件的下一个事件订阅一次性侦听器的最佳方式是什么?_Typescript_Rxjs - Fatal编程技术网

Typescript 在RxJS中,为满足特定条件的下一个事件订阅一次性侦听器的最佳方式是什么?

Typescript 在RxJS中,为满足特定条件的下一个事件订阅一次性侦听器的最佳方式是什么?,typescript,rxjs,Typescript,Rxjs,一些RxJS专家能否告诉我,我订阅下一个满足特定条件的事件的一次性侦听器的方式是否正确,或者是否有明显更好的方式? 我想要一个模式,我可以应用于任何类型的事件,我希望我的事件类型是推断在最后 从“rxjs”导入{Subject}; 从“rxjs/operators”导入{first,map} //我有这个题目。。。 常量主题=新主题(); //... A我想为下一个文本事件订阅此回调。。 const next=(text:string)=>console.log(text); //…这是最好的类

一些RxJS专家能否告诉我,我订阅下一个满足特定条件的事件的一次性侦听器的方式是否正确,或者是否有明显更好的方式? 我想要一个模式,我可以应用于任何类型的事件,我希望我的事件类型是推断在最后

从“rxjs”导入{Subject};
从“rxjs/operators”导入{first,map}
//我有这个题目。。。
常量主题=新主题();
//... A我想为下一个文本事件订阅此回调。。
const next=(text:string)=>console.log(text);
//…这是最好的类型安全方法吗?
主题
.pipe(映射(data=>data.eventName===“TEXT”?[data.TEXT]:null))
.pipe(第一个((数据):数据不可为空=>!!数据))
.订阅(([text])=>next(text))
;
主题:下一个({
“事件名称”:“文本”,
“文本”:“你好,世界”
});


谢谢您的帮助。

我会在第一个
操作符之前使用
过滤器
操作符。
另外,如果需要一些类型检查,还可以为主题将要发出的事件添加一些类型定义

还可以考虑使用
first
在发出第一个TEXT类型的事件后,您将完成对流的订阅,因此该订阅将忽略任何随后发出的事件

这是您可以使用的代码

type TextEvent = {
    eventName: "TEXT";
    text: string;
};
type AgeEvent = {
    eventName: "AGE";
    age: number;
};

//I have this subject...
const subject = new Subject<TextEvent | AgeEvent>();

//... An I want to subscribe this callback for the next text event..
const next= (text: string) => console.log(text);

//...Is this the best type safe way to do it ? 
subject
  .pipe(
    filter(event => event.eventName === 'TEXT'),
    first()
  )
  .subscribe( {
    next: (event: TextEvent ) => console.log(event.text),
    complete: () => console.log('DONE')
  }
  );

// this is not going to be printed
subject.next({
  eventName: "AGE",
  age: 99
});
// this IS going to be printed
subject.next({
  eventName: "TEXT",
  text: "Hello World - I will be printed since I am the first TEXT event to be emitted"
});
// this IS NOT going to be printed
subject.next({
  eventName: "TEXT",
  text: "I WILL NOT BE PRINTED since I come after the first TEXT event emitted"
});
类型TextEvent={
事件名称:“文本”;
文本:字符串;
};
类型AGEVENT={
活动名称:“年龄”;
年龄:人数;
};
//我有这个题目。。。
常量主题=新主题();
//... A我想为下一个文本事件订阅此回调。。
const next=(text:string)=>console.log(text);
//…这是最好的类型安全方法吗?
主题
.烟斗(
过滤器(event=>event.eventName===“TEXT”),
第一()
)
.订阅({
下一步:(event:TextEvent)=>console.log(event.text),
完成:()=>console.log('DONE')
}
);
//这不会被打印出来
主题:下一个({
事件名称:“年龄”,
年龄:99
});
//这将被打印出来
主题:下一个({
eventName:“文本”,
text:“你好,世界-我将被打印,因为我是第一个发出的文本事件”
});
//这不会被打印出来
主题:下一个({
eventName:“文本”,
text:“我将不会被打印,因为我是在发出第一个text事件之后出现的”
});

感谢您抽出时间回复,但此解决方案对我不好。它需要为TextEvent和AgeEvent定义类型别名。同样在下一个函数中,添加TextEvent注释是不安全的,这相当于要求编译器信任我。但我不想被信任,我不值得编译器的信任。不过,从性能的角度来看,您的解决方案更好,我会告诉您这一点。