【问题标题】:TypeScript/RxJS - Observable subscribe() method complete() not runningTypeScript/RxJS - Observable subscribe() 方法 complete() 未运行
【发布时间】:2018-03-29 05:37:29
【问题描述】:

我环顾四周试图解决这个问题,但找不到有效的答案。

当 subscribe() 方法成功返回 'contacts$' observable 时,我正在尝试为附加函数实现回调,但在订阅上使用 complete() 并没有做任何事情。

我也尝试过按照其他地方的建议在可观察对象上使用 finally(),但这也不起作用。

使用完成():

ngOnInit() {
    this.getContacts().subscribe(
        data => {
            this.contacts = data;
            console.log('NewInvoice.contacts:', data);
            this.selectedContactId = this.contacts[0].id;
            console.log('selectedContactId: ' + this.selectedContactId);
        },
        error => {
            console.error('Error getting contacts via subscribe() method:', error);
        },
        () => {
            this.getSelectedContact();
        }
    )
}

使用 finally():

ngOnInit() {
    this.getContacts()
        .finally(() => console.log('a'))
        .subscribe(
            data => {
                this.contacts = data;
                console.log('NewInvoice.contacts:', data);
                this.selectedContactId = this.contacts[0].id;
                console.log('selectedContactId: ' + this.selectedContactId);
            },
            error => {
                console.error('Error getting contacts via subscribe() method:', error);
            },
            () => {
                this.getSelectedContact();
            }
    )
}

可观察完成的回调方法:

getSelectedContact() {
    this.contactsCollection.doc(this.selectedContactId).ref.get().then(snapshot => {
        this.selectedContact = snapshot.data() as Contact;
        console.log('selectedContact:', this.selectedContact);
    })
}

【问题讨论】:

  • 看看here。希望对你有帮助
  • 如果没有getContacts 来源就无法判断。
  • @Roham Rafii - 该帖子的答案从字面上描述了如何做我在我的问题中显示的内容不起作用......
  • getSelectedContact() 中 this.selectedContactId 的值是多少?调用 getSelectedContact() 时是否已经设置了值?
  • 有一些不同之处。该答案使用finallycatchsubscribe

标签: javascript angular typescript rxjs observable


【解决方案1】:

没有更多信息很难说,但我会试一试:

  ngOnInit() {
    this.getContacts()
      .subscribe(
        data => {
          this.contacts = data;
          console.log('NewInvoice.contacts:', data);
          this.selectedContactId = this.contacts[0].id;
          console.log('selectedContactId: ' + this.selectedContactId);
        },
        error => {
          console.error('Error getting contacts via subscribe() method:', error);
        },
        () => {
          this.getSelectedContact()
            .asObservable()
            .subscribe((a) => console.log(a));
        }
      )
  }

还有:

getSelectedContact() {
    return this.contactsCollection.doc(this.selectedContactId).ref.get().then(snapshot => {
        this.selectedContact = snapshot.data() as Contact;
        console.log('selectedContact:', this.selectedContact);
    })
}

或者更干净一点:

    const callback = (a) => console.log(a);
  ...
    () => {
      this.getSelectedContact(callback);
    }
  ...
    getSelectedContact(callback) {
      this.contactsCollection.doc(this.selectedContactId).ref.get()
        .then(snapshot => {
          this.selectedContact = snapshot.data() as Contact;
          console.log('selectedContact:', this.selectedContact);
        })
        .then(a => callback(a));
    }

最后正如@Picci 建议的那样:

this.getContacts()
    .last()
    .exhaustMap((data) => this.getSelectedContact(data))
    .map(a => console.log(a))
    .subscribe();

请注意,以上所有代码均未经测试,仅供参考。

【讨论】:

  • 小心:在 subscribe 中订阅并不是管理 Obaservables 的好方法 - 更好的是 switchMapmergeMap,视情况而定
  • 是的,我知道......但开关图不是他所要求的。他希望在完成时调用某个函数,并将结果(最终)传递给另一个函数。
  • switchMap 结合last 应该可以解决问题,至少我认为,无需在订阅中订阅
  • @Picci 是的 .. "last" 可能是他需要的...用这个选项更新答案。 +1
  • 不幸的是,这似乎不是解决这种情况的方法。 getSelectedContact() 方法不应该有任何参数传递给它,它只是一个回调,并且有/没有参数的 exhaustMap() 方法返回错误“Argument of type '(data: Contact[]) => void'不能分配给“(值:Contact[],索引:数字)=> ObservableInput”类型的参数。类型“void”不可分配给“ObservableInput”类型。 (对不起格式)
猜你喜欢
  • 1970-01-01
  • 2018-12-18
  • 2018-01-23
  • 1970-01-01
  • 2020-10-06
  • 2021-03-25
  • 2020-02-20
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多