【问题标题】:How do I return a list of results with rxjs如何使用 rxjs 返回结果列表
【发布时间】:2017-08-17 13:39:21
【问题描述】:

我正在使用 Ionic 3、Firebase 和 FirebaseAuth。我正在尝试使用当前经过身份验证的用户来检索该用户的对象列表。以下是我的尝试,但出现错误

getContacts 错误:TypeError:您在预期流的位置提供了“未定义”。您可以提供 Observable、Promise、Array 或 Iterable。

我在这里遗漏了一些东西,因为这似乎应该用每条新数据更新onNext

我的尝试:

getContacts() {
    this.contactList.length = 0;
    this.data.getAuthenticatedUserContactList().subscribe(
      (contact => {
        this.contactList.push(contact);
      }),
      (error => console.error(`getContacts Error: ${error}`))
    );
  }

getAuthenticatedUserContactList() {
    return this.afAuth.getAuthUser()
      .flatMap(user => this.database.list(`contact-lists/${user.uid}`).take(1))
      .flatMap((contactList) => {
        if (contactList && contactList.length > 0) {                
          contactList.forEach(element => {
            console.log(`ForEach: ${element.userId}`); // THIS LOGS THE IDS AS EXPECTED 
            return this.database.object(`/profiles/${uid}`, { preserveSnapshot: true }).take(1);
          });
        } else {
          return Observable.throw(new Error("No bros here"));
        }
      });
  }

任何帮助将不胜感激。

根据 forkJoin 建议的解决方案:

getContacts() {
    this.contactList.length = 0;
    this.data.getAuthenticatedUserContactList().subscribe(
      (contact => {
        contact.map(userContact => {
          this.contactList.push(<UserProfile>(userContact));
        });
      }),
      (error => console.error(`getContacts Error: ${error}`))
    );
  }

  getAuthenticatedUserContactList() {
    return this.afAuth.getAuthUser()
      .mergeMap(user => this.database.list(`contact-lists/${user.uid}`).take(1))
      .mergeMap((contactList) => {
        return Observable.forkJoin(contactList.map(element => this.getProfileWithUid(element.userId).map(userProfile => userProfile.val())))
      });
  }

  getProfileWithUid(uid: string) {
    this.profileObject = this.database.object(`/profiles/${uid}`, { preserveSnapshot: true });
    return this.profileObject.take(1);
  }

【问题讨论】:

    标签: javascript firebase firebase-authentication rxjs ionic3


    【解决方案1】:

    在第二个 flatMap() 运算符中,当此条件为真时,您不会返回任何内容:

    contactList && contactList.length > 0
    

    return 语句在 forEach 回调中。

    我不知道您的应用程序的逻辑是什么,但对flatMap 的回调始终需要返回一个 Observable(或此处列出的内容:http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html

    【讨论】:

    • 好吧,我认为 'take(1)' 返回一个 observable:export declare function take(this: Observable, count: number): Observable;跨度>
    • @AnxGotta 它确实返回了一个 Observable ,但这不是问题。我说的是第二个flatMap
    • 我不明白。如果返回的列表没有项目或为空,我从Observable.throw("") 返回一个ErrorObservable。如果列表中有项目,我会为每个项目返回一个 Observable。
    • 不,你不...也许你想写这样的东西? return contactList.map(element =&gt; {...})?或者可能像这样:return Observable.forkJoin(contactList.map(element =&gt; {...}))?这将等到所有 Observable 完成。
    • 对,returnforeach 消耗。我使用forkJoin 来解决我的问题。更新了上面的代码以反映更改。感谢您的帮助!
    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多