【问题标题】:How to subscribe array of Observable Forkjoin not working如何订阅 Observable Forkjoin 数组不起作用
【发布时间】:2021-03-02 11:03:29
【问题描述】:

我正在尝试使用 forkjoin 以角度方式执行多个 HTTP 请求。但是当我订阅 Observable 时,它​​没有给出任何响应。

 let data = this.email.map((email) =>
          this.get_student_service.get_student_by_email_id(email)
        );

        forkJoin([data]).subscribe((res) => {
          console.log(res);
        });

        console.log('Execute');

这是我的服务

  get_student_by_email_id(email) {
    return this.fire_store
      .collection('User', (ref) => ref.where('email', '==', email))
      .valueChanges();
  }

【问题讨论】:

  • 你能摆脱地图,直接让 data = this.get_student_sesrvices.get_student_by_email_id(this.email)。 ?
  • 同样的问题无法订阅。空响应
  • 你的this.email 是什么?当你得到它?请记住,除非您在 this.email 中没有任何价值,否则您无法创建 forkJoin 和订阅。看起来您在异步函数中为 this.email 赋予了价值,并在异步函数完成之前执行了 forkJoin 订阅
  • this.email 包含一个电子邮件地址的数组
  • get_student_email() { this.get_project_service.get_project_by_doc_id(this.batchID, this.projectID) .subscribe((res) => { this.response = res; this.email = this.response.student; let data = this.response.student.map((email) => this.get_student_service.get_student_by_email_id(email)); let info = forkJoin([data]);console.log('info:', info);info.subscribe((res) => {console.log(res)console.log('Execute')})})}

标签: javascript angular firebase google-cloud-firestore rxjs


【解决方案1】:

到目前为止,我没有得到任何答案。所以现在我在 component.ts 中重新初始化 vanilla firebase 并尝试它对我有用。如果有人使用角火解决了这个问题,请告诉我。 这是我的解决方案

const firebaseapp = firebase.initializeApp(environment.firebase);

get_student_email() {
    let store = firebaseapp.firestore();
    this.get_project_service
      .get_project_by_doc_id(this.batchID, this.projectID)
      .subscribe(async (res) => {
        this.response = res;
        this.email = [
          'admin@gmail.com',
          'test01@gmail.com',
          'intern01@gmail.com',
        ];
        const information = await Promise.all(
          this.email.map(async (i) => {
            let a = await store
              .collection('User')
              .where('email', '==', i)
              .get();
            let collection;
            a.forEach((element) => {
              collection = element.data();
            });
            return collection;
          })
        );
        //  request end
        console.log(information);
      });
    // subscriber End
  }

【讨论】:

    【解决方案2】:

    好的,如果您在没有地图功能的帮助下无法订阅,我认为您的 get_student_xxx 函数没有返回 observable。

    如果该函数返回一个 observable,您就可以订阅它。

    您可以这样做以获得转译器的一些额外帮助:

    get_student_by_email_id(email) : Observable<someobject> {
    ...
    }
    

    所以这给了你几个选择...也许你只需要改变返回值而不是使用 Observable 和订阅?

    或者您可能需要返回一个不同的可观察对象。

    还有一些方法可以创建自己的 observable,例如 rxjs 有一个名为“of”的函数,您可以使用该函数将对象“包装”在 observable 中:

    // RxJS v6+
    import { of } from 'rxjs';
    //emits any number of provided values in sequence
    const source = of(1, 2, 3, 4, 5);
    //output: 1,2,3,4,5
    const subscribe = source.subscribe(val => console.log(val));
    

    如果你的函数返回一个可观察的数组,那么 [data] 是否应该只是数据

    【讨论】:

    • 没有 get_student 函数返回 obserable 的数组 `[Observable, ObservablObservable, Observable]` 像这样和 forkjoin 后单个 Observable 仍然存在
    • 如果你的函数返回一个可观察的数组,那么 [data] 是否应该只是数据?
    • 问题仍然是如何订阅这个由 forkjoin 调用返回的 Observable
    • forkjoin 返回单个 observable let info = forkJoin(data); console.log('info:', info);
    • 输出 info: Observable {_isScalar: false, _subscribe: ƒ}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2017-11-18
    • 2019-05-14
    • 1970-01-01
    • 2020-03-29
    • 2021-07-05
    • 2017-11-26
    相关资源
    最近更新 更多