angular rxjs主题和订阅不起作用

时间:2018-03-06 23:38:38

标签: angular

在我的服务中,我创建了一个我将在另一个组件中使用的observable

const rev = (list, reversed) => {
    if (list.length == 0) return reversed

    reversed.unshift(list[0])
    return rev(list.slice(1), reversed)
}

const reverse = (list) => rev(list, [])

然后在我的组件中,我订阅了observable。

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { Router } from '@angular/router';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';


@Injectable()
export class ApiHandlerService {

    modalObject = new Subject<any>();

    constructor(
        private router: Router,
        private http: HttpClient,
    ) {}

    responseHandler(response) {
        if (response.success) {
            const obj = {
                exception: false,
                payload: response.payload
            };
            this.modalObject.next(obj);
            return obj;
        } else {
            const obj = {
                exception: true,
                message: response.exception.message,
                segNum: response.exception.seqNum
            };
            this.modalObject.next(obj);
            return obj;
        }
    }

    errorHandler(err) {
        if (err instanceof HttpErrorResponse) {
            if (err.status === 401) {
                this.router.navigate(['/app-login']);
            }
        }
    }

}

所以你可以看到,当我订阅时,我只是在这一点上尝试console.log订阅值。这似乎不起作用,我对可观察到的东西有点太新,无法弄清楚出了什么问题?

2 个答案:

答案 0 :(得分:0)

  1. 尝试使用视图中服务返回的值,这将确保从“当前组件”正确调用服务...
  2. 在服务本身内,放置一些日志记录语句以确保您可以获得可返回的代码......
  3. 通常,此代码有效

    ngOnInit() {
        this.allSpecies = this.birdService.getAllSpeciesFromFirebase();
        this.specieSub = this.allSpecies.subscribe(data => console.log(data));
    }
    

    这里,“allSpecies”是一个可观察的,specieSub是一个订阅。数据将根据服务返回的方式记录为数组或包装对象。

    由于Subject是Observable的超类,它应该也可以工作..无论如何尝试降级到Observable本身并查看所有代码是否正常工作......

    发布任何更新或生成的日志

答案 1 :(得分:0)

可能导致此情况的一些原因:

1。您必须在提供者中添加服务

    @Component({
    selector: 'app-api-handler-modal',
    templateUrl: './api-handler-modal.component.html',
    providers:[ApiHandlerService]
})
  1. 当您订阅时,应根据您的情况进行service.methodInService()。subscribe()

    this.apiHandlerService.responseHandler()。subscribe(obj => console.log(obj));     }

  2. 构造函数(公共 apiHandlerService:ApiHandlerService)