2017-10-06 114 views
4

我搜索了前面的线索询问此错误消息。从我能找到的这个错误消息有两个记录的原因。属性'toPromise'类型上不存在'Observable <Response>

  1. 缺少import 'rxjs/add/operator/toPromise'import 'import 'rxjs/add/operator/map'

  2. 错误与Visual Studio(这我不使用)。

这是问题

import { Injectable } from '@angular/core'; 
import { Headers, Http } from '@angular/http'; 

import {Observable} from 'rxjs/Rx'; 
import 'rxjs/add/operator/toPromise'; 
import 'rxjs/add/operator/map'; 

import { Event } from './event'; 

@Injectable() 
export class EventService { 

    private eventsUrl = 'api/events'; // URL to web api 
    private headers = new Headers({'Content-Type': 'application/json'}); 

    constructor(private http: Http) { } 

    getEvents(): Promise<Event[]> { 
    return this.http.get(this.eventsUrl) 
       .toPromise() 
       .then(response => response.json().data as Event[]) 
       .catch(this.handleError); 
    } 
} 

代码上面的代码给我的错误Property 'toPromise' does not exist on type 'Observable<Response>'

编辑:感谢@estus我发现我安装的软件包中的一个错误。该软件包有自己的node_modules,它也有rxjs导致项目中出现重复的rxjs。

+0

请问您为什么使用“toPromise”?除非在极少数情况下使用旧服务返回时才推荐。 (哪个Angular的Http不是其中之一。)注意:angular.io中的教程仍然存在,但它目前已过时。 – DeborahK

+0

@DeborahK我明白了。我正在遵循toh教程,这就是它的原因。感谢您的信息。我将研究如何处理由Angular Http返回的Observable的正确方法。 – dendrobium

+0

您正在使用哪个版本的Angular?根据版本,HTTP响应将以不同的方式处理 –

回答

0

感谢@estus。我发现我错误地安装了一个软件包。该软件包有自己的node_modules,它也有rxjs,导致项目中出现重复的rxjs包。

0

考虑从@angular/http进口Response这样的:

import {Http, Headers, Response} from '@angular/http'; 

也许也升级到打字稿的最新版本可以帮助:

npm i -g [email protected] 

一个侧面说明也最好是单独像导入可观测这来自Rxjs而不是整个库:

import { Observable } from 'rxjs/Observable'; 
+0

我尝试导入响应,它是相同的结果。我不得不降级打字稿到2.4.0因为这个错误'类'主题'错误地扩展了基类'Observable '。'我现在试图摆脱toPromise,因为根据DeborahK该教程已过时。 – dendrobium

+0

当然没问题,我通常在回答时我不想强迫选择,我只是坚持这个问题,因为其他搜索云的人最终会在这里结束,他们只是想解决问题标题中提到的问题。所以最好删除这个问题,如果这个问题变得无关紧要,可以换一个。顺便说一下,您是使用角度cli生成项目还是从过时的回购中克隆它? –

+0

好点。而且我使用角色创建新的''。 – dendrobium

2

您可能需要按照使用新HttpClient的更新文档:https://angular.io/guide/http(尽管它们没有服务中的代码)。

服务

然后在服务的代码应该是这样的:

import { Injectable } from '@angular/core'; 
import { HttpClient} from '@angular/common/http'; 

import { Observable } from 'rxjs/Observable'; 

import { IMovie } from './movie'; 

@Injectable() 
export class MovieService { 
    private moviesUrl = './api/movies/movies.json'; 

    constructor(private http: HttpClient) { } 

    getMovies(): Observable<IMovie[]> { 
     return this.http.get<IMovie[]>(this.moviesUrl); 
    } 
} 

组件

和组件代码调用此方法应该是这样的:

ngOnInit(): void { 
    this.movieService.getMovies() 
     .subscribe((movies: IMovie[]) => this.movies = movies); 
} 
+0

即使我发现了toPromise行为不当的原因。我会尝试使用最新的方式来处理您的建议中的http请求。谢谢! – dendrobium

相关问题