【问题标题】:How are the three callback functions received into subscribe method as one object?订阅方法中的三个回调函数如何作为一个对象接收?
【发布时间】:2020-12-01 10:50:50
【问题描述】:

我们做了一些可观察的之后

let observable = new Observable(observer => {
      let x = 5;
      if (x == 15) {
        observer.error('something went wrong');
      } else {
        observer.next('produce some value');
      }
      observer.complete();
    });

从观察者那里订阅这三个回调函数有不同的方式。

observable.subscribe(
      function next(data) {
        console.log(data);
      },
      function error(err) {
        console.log(err);
      },
      function complete() {
        console.log('done');
      }
    )

或者用箭头函数代替function关键字

observable.subscribe(
      x => 
      {
      console.log(x);
      },
      err => 
      {
        console.log(err);
      },
      () => 
      {
        console.log('done');
      },

这两种方式都有效 - 所以在订阅方法的最后,我们以三种方式结束 从观察者那里获取值的函数。

但是当我写例子时

observable.subscribe({
      next: (data) => console.log(data),
      error: (err) => console.log(err),
      complete: () => console.log('done')
    })

它仍在工作。但我不明白它是如何工作的,因为这里我们有三个功能 在一个物体内。在前面的两个示例中,我们直接使用了三个函数。

我的问题是当函数被“包装”在一个对象中时它是如何以及为什么工作的?

【问题讨论】:

  • 订阅方法就是这么写的。它接受最多 3 个回调或像您一样实现的对象。两种方法是等价的。
  • 好的 quentin,感谢您的反馈。如何在 subscribe 方法的后台看到实现?
  • 你通常可以在你的 node_modules 中检查类型定义。就我而言,它位于 node_modules/rxjs/internal/Observable.d.ts 中,然后搜索“subscribe”。但是如果你想查看源代码,去查看github仓库github.com/ReactiveX/rxjs/blob/master/src/internal/…

标签: angular rxjs


【解决方案1】:

这是一个订阅的伪代码实现

subscribe(...args){
  let observer = {
    next: _ => {/* Do nothing */},
    error: err => { throw err },
    complete: () => {/* Do nothing */}
  }

  if(isAFunction(args[0])) observer.next = args[0];
  if(isAFunction(args[1])) observer.error = args[1];
  if(isAFunction(args[2])) observer.complete = args[2];

  if(isAnObject(args[0])){
    const partialObserver = args[0];
    if(isAFunction(partialObserver.next)) observer.next = partialObserver.next;
    if(isAFunction(partialObserver.error)) observer.error = partialObserver.error;
    if(isAFunction(partialObserver.complete)) observer.complete = partialObserver.complete;
  }

  return this._subWithObserver(observer);
}

显然,这不是完整的故事,但它是关于如何完成的一个想法。您可以深入研究源代码,了解部分观察者和/或函数如何映射到适当的观察者。

在幕后,errorcomplete 实际上是为了确保遵守 Observable 合约。

【讨论】:

  • 感谢 Mrk.I 接受并赞成您的回答。您能否在评论或您的答案中写下我,以及您在此处粘贴的此源代码的链接,来自他们的文档?我试图在这里找到 github.com/ReactiveX/rxjs/blob/master/src/internal/… 但我没有找到它。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2021-01-16
  • 2022-06-27
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多