首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >subscriber.next()不是在subscriber.error语句之后触发的

subscriber.next()不是在subscriber.error语句之后触发的
EN

Stack Overflow用户
提问于 2022-02-08 16:46:46
回答 2查看 183关注 0票数 1

根据输入的数据,我想决定它是否有效的数据,并发送可观察到的结束。

我试图创建一个可观察的、连续的subscribe.next()是正确的,但是任何错误都是随之而来的,在此之后,没有一个语句工作正常。

代码语言:javascript
复制
const observable = new Observable((subscriber) => {
  subscriber.next(1);
  subscriber.next(2);
  subscriber.error('failed this after second');
  subscriber.next(3);
  subscriber.next(4);
  subscriber.complete();
});

observable.subscribe({
  next(x) {
    console.log('got value ' + x);
  },
  error(err) {
    console.error('something wrong occurred: ' + err);
  },
  complete() {
    console.log('done');
  },
});

当前产出:

  • 得值1
  • 得值2
  • 出了点问题:一秒后失败

预期产出

  • 得值1
  • 得值2
  • 出了点问题:一秒后失败
  • 得值3
  • 得值4
  • 完成

下面是stackblitz链接https://stackblitz.com/edit/zlksm5?devtoolsheight=50&file=index.ts

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-08 17:21:09

可观察的契约

OnError:

  • 指示可观察到的终止了具有指定错误条件的,并且它将不再发出进一步的项。

强调我的。

如果你想要一件事情在它完成后继续前进,你就不想要一个可以观察到的东西。

走向解决

只需将错误作为值发出即可。您可以(例如)将您的排放量封装在RxJS 通知对象中,以便您可以观察materializedematerialize,并保持一致的排放API。

例如:

代码语言:javascript
复制
const observable = new Observable(subscriber => {
  subscriber.next({ kind: "N", value: 1 });
  subscriber.next({ kind: "N", value: 2 });
  subscriber.next({ kind: "E", error: new Error("failed this after second") });
  subscriber.next({ kind: "N", value: 3 });
  subscriber.next({ kind: "N", value: 4 });
  subscriber.next({ kind: "C" });
  subscriber.complete();
});

/**** Alternative written more succinctly ****/

const observable = of(
  { kind: "N", value: 1 },
  { kind: "N", value: 2 },
  { kind: "E", error: new Error("failed this after second") },
  { kind: "N", value: 3 },
  { kind: "N", value: 4 },
  { kind: "C" }
);
代码语言:javascript
复制
observable.subscribe((notification) => {
  switch (notification.kind) {
    case "N":
      console.log("got value ", notification.value);
      break;
    case "E":
      console.error("something wrong occurred: ", notification.error.message);
      break;
    case "C":
      console.log("done");
  }
});
票数 1
EN

Stack Overflow用户

发布于 2022-02-08 17:25:51

我认为这是不可能的一个可观察的,因为可观察的将关闭,如果发生任何错误。

我尝试过几种方法,以供参考。

代码语言:javascript
复制
//interval(1000)
observable
  //.pipe(switchMap(() => observable))
  .pipe(
    catchError((d) => {
      observable.subscribe((nd) => {
        console.log('--again--', nd);
      });
      return of(d);
    })
    //retry(1)
  )
  .subscribe({
    next(x) {
      console.log('got value ' + x);
    },
    error(err) {
      console.error('something wrong occurred: ' + err);
    },
    complete() {
      console.log('done');
    },
  });

// interval(1000)
//   .pipe(switchMap(_ => observable))
//   .pipe(
//     catchError((d) => {return of(d)}),
//     switchMap(_ => observable)
//   )
// .subscribe(d => {
//   console.log(d)
// })

对于用例,最好使用行为主题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71037622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档