可观察最后订阅

时间:2016-11-20 17:54:42

标签: javascript rxjs rxjs5

根据this artcleonComplete的{​​{1}}和onError功能是相互排斥的。

含义subscribeonError事件将在我的onComplete中启动 我有一个逻辑块,无论是否收到错误都需​​要执行,或者我成功完成了大量的信息。

我查找了类似finally in python的内容,但我找到的只是finally,需要附加到我创建的可观察对象上。

但是我想在我订阅时,以及在流结束之后,无论是成功还是出错,都要做那个逻辑。

有什么想法吗?

3 个答案:

答案 0 :(得分:86)

此运算符的当前“pipable”变体称为finalize()(自RxJS 6起)。较旧且现已弃用的“补丁”运算符称为finally()(直到RxJS 5.5)。

我认为finalize()运算符实际上是正确的。你说:

  

仅在我订阅时以及在流结束后执行该逻辑

我认为这不是问题。如果您愿意,可以在订阅之前使用source并使用finalize()。这样,您就不需要始终使用finalize()

let source = new Observable(observer => {
  observer.next(1);
  observer.error('error message');
  observer.next(3);
  observer.complete();
}).pipe(
  publish(),
);

source.pipe(
  finalize(() => console.log('Finally callback')),
).subscribe(
  value => console.log('#1 Next:', value),
  error => console.log('#1 Error:', error),
  () => console.log('#1 Complete')
);

source.subscribe(
  value => console.log('#2 Next:', value),
  error => console.log('#2 Error:', error),
  () => console.log('#2 Complete')
);

source.connect();

打印到控制台:

#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message

2019年1月:更新了RxJS 6

答案 1 :(得分:16)

唯一对我有用的是这个

fetchData()
  .subscribe(
    (data) => {
       //Called when success
     },
    (error) => {
       //Called when error
    }
  ).add(() => {
       //Called when operation is complete (both success and error)
  });

答案 2 :(得分:12)

我现在在Angular应用程序中使用RxJS 5.5.7,并且对于我的用例,使用finalize运算符的行为很奇怪,因为它在成功或错误回调之前被触发了。

简单的例子:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000),
    finalize(() => {
      // Do some work after complete...
      console.log('Finalize method executed before "Data available" (or error thrown)');
    })
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );

我必须在订阅中使用add方法来完成我想要的。完成成功或错误回调后,基本上是finally回调。类似于try..catch..finally块或Promise.finally方法。

简单的例子:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000)
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );
  .add(() => {
    // Do some work after complete...
    console.log('At this point the success or error callbacks has been completed.');
  });