订阅不是函数错误

Posted

技术标签:

【中文标题】订阅不是函数错误【英文标题】:Subscribe is not a function error 【发布时间】:2018-01-23 16:19:51 【问题描述】:

我正在尝试从服务订阅 observable,它构建时没有错误,但在浏览器中查看时出现错误“this.service.getBanners(...).subscribe is not a function”。

服务:

import  Injectable  from '@angular/core';
import  Observable  from 'rxjs';

@Injectable()

export class BannerService 

    banners: any = ['1','2','3'];

    constructor(
    ) 

    getBanners(): Observable<any[]> 
        return this.banners;
    

    setBanners(banners: any[]): void 
        this.banners = banners;
    


组件:

import  Component, ViewEncapsulation, OnInit  from '@angular/core';
import  Observable  from 'rxjs';
import  BannerService  from './../banner/banner.service';

@Component(
    selector: '.banner',
    templateUrl: './banner.component.html',
    styleUrls: ['./banner.component.sass'],
    encapsulation: ViewEncapsulation.None
)

export class BannerComponent implements OnInit 

    banners: any[];

    constructor(private bannerService: BannerService)

    

    ngOnInit() 
        this.bannerService.getBanners().subscribe(banners => this.banners = banners);
    

任何想法我做错了什么?

【问题讨论】:

【参考方案1】:

您应该返回一个 observable ,而不是返回一个数组:

对于 Angular

getBanners(): Observable<any[]> 
    return Observable.of(this.banners);

对于 Angular >= 6.x.x

getBanners(): Observable<any[]> 
    return of(this.banners);

Reference

【讨论】:

谢谢,这修正了错误。我还按照 Yakov Fain 在他的回答中的建议更改了导入,并导入了 import 'rxjs/add/observable/of' 。我有一个带有异步管道的 *ngFor,但是当我调用 setBanner 并更改横幅数组的内容时它不会更新。【参考方案2】:

需要解决一些问题。

    你声明你的函数 getBanners() 返回一个 Observable,但你返回一个数组。因此,将您的 return 语句更改为

    return Observable.from(this.banners);

您还需要添加以下内容:

import 'rxjs/add/observable/from'; 

    这是不好的做法,会将整个 rxjs 库包含到您的代码中:

    import Observable from 'rxjs';

只导入你需要的东西。将以上内容替换为

import  Observable  from 'rxjs/Observable'; 

【讨论】:

谢谢,我原来确实有这样的导入,但我在测试时删除了它,我已经把它改回来了。出于某种原因,我在使用 Observable.from 时遇到了错误,所以我按照 Sajeetharan 的建议将其更改为 Observable.of 并修复了错误。 最近第2点好像变了,见:RxJS 6 Changes - Overview "Import Statement。 没错,我在这里写了关于 RxJS 6 的博客:yakovfain.com/2018/05/02/…

以上是关于订阅不是函数错误的主要内容,如果未能解决你的问题,请参考以下文章

stripe.confirmCardPayment 不是函数

GraphQL 订阅 - subscriptionsClient.subscribe 不是函数

NextJs - 页面中 API 文件夹中的函数给出“res.status 不是函数”错误

Azure 函数的托管标识是不是可以跨多个订阅进行访问?

在嵌套和依赖订阅中手动触发错误函数

计算错误,请帮我看看?