Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.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如何完成可观察的?_Javascript_Angular_Typescript_Ecmascript 6_Rxjs - Fatal编程技术网

Javascript rxjs如何完成可观察的?

Javascript rxjs如何完成可观察的?,javascript,angular,typescript,ecmascript-6,rxjs,Javascript,Angular,Typescript,Ecmascript 6,Rxjs,为了学习rxjs,我正在玩它。 我的代码: 我的想法是运行40次,然后完成可观察的(这可能是另一个要求,例如,在10:00查看值是否为10(主要目标是使用值进行评估并强制完成))。 我正在寻找占位符finish()的替代项,因为finish不存在。如何访问subscribe方法的resolve函数console.log('resolved') 我找到了答案,但答案是2015年的,我假设目前的rxjs版本已经有了答案。实际上还是一样的,你只需要使用管道操作符。您可以查看示例 我的想法是运行40次`

为了学习rxjs,我正在玩它。 我的代码:


我的想法是运行40次,然后完成可观察的(这可能是另一个要求,例如,在10:00查看值是否为10(主要目标是使用值进行评估并强制完成))。 我正在寻找占位符finish()的替代项,因为finish不存在。如何访问subscribe方法的resolve函数console.log('resolved')


我找到了答案,但答案是2015年的,我假设目前的rxjs版本已经有了答案。

实际上还是一样的,你只需要使用管道操作符。您可以查看示例

我的想法是运行40次`

为此,您可以添加
take(40)
。一般来说,有几个操作符,比如
take
,可以完成一个可观察的过程。退房


两个答案都提到takeuntil和take是正确的,但另一种方法是使用subscription对象取消订阅,这只是另一个选项

const subx= example.subscribe(val =>  { 
   console.log(val); 
   if (val == 40) {
    subx.unsubscribe() 
   }
 });

演示感谢您的回答,假设我想做一些基于时间的事情,例如,如果我们在10:00时的值为10,则完成。因此,对于特定的if情况,我们可以做一些类似source.pipe的事情(takeUntil(value==10&&time==10:00)。这个问题的主要目的是看我是否可以在特定情况下“强制”完成。是的,你可以使用TakeUtil和TakeUtil take in observable作为论点,你可以尝试使用@malbarmawi answer。在这种情况下,手动取消订阅是可以的。我喜欢TakeUtil运算符。这可能是另一个要求,但只是为了让我选择的示例更简单例如,如果计数器在10:00时为10,则可能是finish。因此,我们必须对该值进行求值。finish从何而来?@TonyNgo我正在寻找如何发送complete/finish,强制是伪代码,它不存在。我希望以订阅者的complete方法结束。在这种情况下,您可以执行另一个take操作r-takeUntil。示例:
takeUntil(计时器(targetDate-new Date())
谢谢,这解决了问题。我们可以接受,如果有一种方法可以从observable发送完整信息,那就太好了。让我们假设我现在有1000个订户,我必须向所有的observable添加一个比较,而不是在observable中添加一次,然后广播一个finish。@SvenvandenBoogaart在这种情况下,您可以使用take操作符,我会的更新我的answer@malbarmawi如果10:00时的值是10,那么这并不能解决我想要基于状态完成的情况。第一个解决方案是目前为止最好的。
import { interval, timer } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

const source = interval(1000);
const timer$ = timer(5000);
const example = source.pipe(takeUntil(timer$));
const subscribe = example.subscribe(val => console.log(val));
// RxJS v6+
import { withLatestFrom, map } from 'rxjs/operators';
import { interval } from 'rxjs';

const source = interval(1000);

const example = source.pipe(
  take(40),
  map(value => value +1),
  map(value => {
    if(value === 40) {
      finish();
    }
    else if (value % 5 === 0){
      return 'can devide by 5 we did some magic';
  }else{
     return value;
  } })
);
const subscribe = example.subscribe(
  val => console.log(val), 
  error => console.log("Error handled: " , error), 
  () => console.log('resolved'));
const subx= example.subscribe(val =>  { 
   console.log(val); 
   if (val == 40) {
    subx.unsubscribe() 
   }
 });