可观察最后订阅

Ami*_*ugi 84 javascript rxjs rxjs5

根据这个artcle,onCompleteonError功能subscribe是互斥的.

任何意义onErroronComplete事件将在我的事件中激起subscribe.
我有一个逻辑块,无论是否收到错误都需​​要执行,或者我成功完成了大量的信息.

finally在python中查找类似的内容,但我发现的只是finally需要附加到我创建的可观察对象上.

但是我想在我订阅时,在流结束后,无论是成功还是出错,都要做这个逻辑.

有任何想法吗?

mar*_*tin 104

调用此运算符的当前"pipable"变体finalize().调用了较旧且现已弃用的"补丁"运算符finally().

我认为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();
Run Code Online (Sandbox Code Playgroud)

这打印到控制台:

#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message
Run Code Online (Sandbox Code Playgroud)

2019年1月:更新了RxJS 6

  • 从RXJS 5.5开始,"finally"不再是Observable方法.使用"finalize"运算符:source.pipe(finalize(()=> console.log('Finally callback'))).subscribe(...); https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md (7认同)
  • 是的,那太糟糕了.有人会认为`finally`块会在你的代码中出现. (5认同)
  • Finalize 的问题是它等待“complete()”调用。如果你想在每次发射时使用finally(如果可观察发射成功则执行_a_,如果错误,则执行_b_,而在这两种情况下执行_c_)怎么办? (3认同)

Har*_*Das 39

唯一对我有用的是这个

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

  • 你是救世主 (3认同)

pca*_*sme 19

我现在在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);
      }
  );
Run Code Online (Sandbox Code Playgroud)

我不得不add在订阅中使用medhod来完成我想要的东西.基本上是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.');
  });
Run Code Online (Sandbox Code Playgroud)

  • 自发布此答案以来,最终确定运算符肯定已更改。使用您发布的代码说明 Finalize 运算符被过早调用,它对我来说按预期工作。 (4认同)