属性'toPromise'类型上不存在'Observable
我搜索了前面的线索询问此错误消息。从我能找到的这个错误消息有两个记录的原因。属性'toPromise'类型上不存在'Observable <Response>
缺少
import 'rxjs/add/operator/toPromise'
或import 'import 'rxjs/add/operator/map'
错误与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。
感谢@estus。我发现我错误地安装了一个软件包。该软件包有自己的node_modules,它也有rxjs,导致项目中出现重复的rxjs包。
考虑从@angular/http
进口Response
这样的:
import {Http, Headers, Response} from '@angular/http';
也许也升级到打字稿的最新版本可以帮助:
npm i -g [email protected]
一个侧面说明也最好是单独像导入可观测这来自Rxjs而不是整个库:
import { Observable } from 'rxjs/Observable';
我尝试导入响应,它是相同的结果。我不得不降级打字稿到2.4.0因为这个错误'类'主题
当然没问题,我通常在回答时我不想强迫选择,我只是坚持这个问题,因为其他搜索云的人最终会在这里结束,他们只是想解决问题标题中提到的问题。所以最好删除这个问题,如果这个问题变得无关紧要,可以换一个。顺便说一下,您是使用角度cli生成项目还是从过时的回购中克隆它? –
好点。而且我使用角色创建新的''。 – dendrobium
您可能需要按照使用新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);
}
即使我发现了toPromise行为不当的原因。我会尝试使用最新的方式来处理您的建议中的http请求。谢谢! – dendrobium
请问您为什么使用“toPromise”?除非在极少数情况下使用旧服务返回时才推荐。 (哪个Angular的Http不是其中之一。)注意:angular.io中的教程仍然存在,但它目前已过时。 – DeborahK
@DeborahK我明白了。我正在遵循toh教程,这就是它的原因。感谢您的信息。我将研究如何处理由Angular Http返回的Observable的正确方法。 – dendrobium
您正在使用哪个版本的Angular?根据版本,HTTP响应将以不同的方式处理 –