我正在尝试从Angular调用API,但出现此错误:
Property 'map' does not exist on type 'Observable<Response>'
这个类似问题的答案不能解决我的问题:Angular 2 beta.17:类型'Observable <Response>'上不存在属性'map'。
我正在使用Angular 2.0.0-beta.17。
我正在尝试从Angular调用API,但出现此错误:
Property 'map' does not exist on type 'Observable<Response>'
这个类似问题的答案不能解决我的问题:Angular 2 beta.17:类型'Observable <Response>'上不存在属性'map'。
我正在使用Angular 2.0.0-beta.17。
Answers:
您需要导入map
运算符:
import 'rxjs/add/operator/map'
或更笼统地说:
import 'rxjs/Rx';
注意:对于RxJS 6.x.x
及更高版本,您将必须使用可管道运算符,如下面的代码片段所示:
import { map } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';
// ...
export class MyComponent {
constructor(private http: HttpClient) { }
getItems() {
this.http.get('https://example.com/api/items').pipe(map(data => {})).subscribe(result => {
console.log(result);
});
}
}
这是由于RxJS团队取消了对使用的支持。有关更多信息,请参见RxJS更改日志中的重大更改。
从变更日志:
运算符:现在必须从rxjs导入可管道运算符,如下所示:
import { map, filter, switchMap } from 'rxjs/operators';
。没有深度进口。
Observable
课程?像这样:import {Observable} from 'rxjs/Observable';
还是import {Observable} from 'rxjs/Rx';
?
npm install rxjs-compat
,而不是导入map
运算符。
再来一遍,因为这里没有列出我的解决方案。
我使用rxjs 6.0运行Angular 6并遇到此错误。
这是我修复它的方法:
我变了
map((response: any) => response.json())
简单地是:
.pipe(map((response: any) => response.json()));
我在这里找到了解决方法:
https://github.com/angular/angular/issues/15548#issuecomment-387009186
import { map } from 'rxjs/operators';
.catch
,我们可以使用catchError
像.pipe(catchError(this.handleError))
?
只需在您的项目的vs代码终端中编写此命令,然后重新启动项目即可。
npm install rxjs-compat
您需要map
通过写入以下内容来导入运算符:
import 'rxjs/add/operator/map';
对于Angular 7v
更改
import 'rxjs/add/operator/map';
至
import { map } from "rxjs/operators";
和
return this.http.get('http://localhost/ionicapis/public/api/products')
.pipe(map(res => res.json()));
我在Angular 2.0.1中遇到了相同的问题,因为我从中导入了Observable
import { Observable } from 'rxjs/Observable';
我解决了从此路径导入Observable的问题
import { Observable } from 'rxjs';
Observable
(包括您不使用的运算符)导入束中。相反,您应该分别导入每个运算符。我建议使用RxJS v5.5中引入的“ lettable运算符”,以支持更好的摇树。
在rxjs 6中,地图运算符的用法已更改,现在您需要像这样使用它。
import { map } from 'rxjs/operators';
myObservable
.pipe(map(data => data * 2))
.subscribe(...);
供参考 https://www.academind.com/learn/javascript/rxjs-6-what-changed/#operators-update-path
RxJS v6
都需要使用,.pipe()
否则任何一个运算符都不会直接在Observable上工作。您会看到类似的错误,Property 'share' does not exist on type 'Observable<{}>'
在最新的Angular 7。*。*中,您可以尝试以下操作:
import { Observable, of } from "rxjs";
import { map, catchError } from "rxjs/operators";
然后,您可以methods
按以下方式使用它们:
private getHtml(): Observable<any> {
return this.http.get("../../assets/test-data/preview.html").pipe(
map((res: any) => res.json()),
catchError(<T>(error: any, result?: T) => {
console.log(error);
return of(result as T);
})
);
}
查看此演示以获取更多详细信息。
就我而言,仅包含map和promise是不够的:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
我通过导入几个rxjs组件(按照官方文档的建议)解决了这个问题:
1)在一个app / rxjs-operators.ts文件中导入语句:
// import 'rxjs/Rx'; // adds ALL RxJS statics & operators to Observable
// See node_module/rxjs/Rxjs.js
// Import just the rxjs statics and operators we need for THIS app.
// Statics
import 'rxjs/add/observable/throw';
// Operators
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/toPromise';
2)在服务中导入rxjs-operator本身:
// Add the RxJS Observable operators we need in this app.
import './rxjs-operators';
import { map } from "rxjs/operators";
getGetFunction(){
this.http.get('http://someapi')
.pipe(map(res => res));
}
getPostFunction(yourPara){
this.http.get('http://someapi',yourPara)
.pipe(map(res => res));
}
在上面的函数中,您可以看到我没有使用res.json(),因为我使用的是HttpClient。它会自动应用res.json()并返回Observable(HttpResponse <string>)。在HttpClient中的angular 4之后,您不再需要自己调用此函数。
我正在使用Angular 5.2,当我使用Angular 5.2时,import 'rxjs/Rx';
它引发以下lint错误:
TSLint:此导入已列入黑名单,请改为导入子模块(import-blacklist)
解决方案: 通过仅导入所需的运算符来解决此问题。示例如下:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
因此,解决方法是只导入必要的运算符。
只需安装rxjs-compat即可解决问题
npm i rxjs-compat --save-dev
然后像下面一样导入
import 'rxjs/Rx';
首先运行安装如下:
npm install --save rxjs-compat@6
现在,你需要导入rxjs
的service.ts
:
import 'rxjs/Rx';
瞧!该问题已解决。
我尝试了上面所有可能的答案,但没有一个起作用,
我只需重新启动IDE(即Visual Studio Code)即可解决此问题
愿它对某人有帮助。
我也面临着同样的错误。为我工作的一个解决方案是添加在你的下面几行service.ts文件代替的import 'rxjs/add/operator/map'
:
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
例如,调试后我的app.service.ts就像
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class AppService {
constructor(private http: HttpClient) {}
getData(): Observable<any> {
return this.http.get('https://samples.openweathermap.org/data/2.5/history/city?q=Warren,OH&appid=b6907d289e10d714a6e88b30761fae22')
.pipe(map(result => result));
}
}
如果在导入导入'rxjs / add / operator / map'或导入'rxjs / Rx'之后也遇到相同的错误,然后重新启动Visual Studio代码编辑器,该错误将得到解决。
在map
function中使用pipe
function,它将解决您的问题。您可以在此处查看文档。
this.items = this.afs.collection('blalal').snapshotChanges().pipe(map(changes => {
return changes.map(a => {
const data = a.payload.doc.data() as Items;
data.id = a.payload.doc.id;
return data;
})
})
npm安装rxjs @ 6 rxjs-compat @ 6-保存
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable({
providedIn: 'root'
})
export class RestfulService {
constructor(public http: Http) { }
//access apis Get Request
getUsers() {
return this.http.get('http://jsonplaceholder.typicode.com/users')
.map(res => res.json());
}
}
运行命令
npm install rxjs-compat
我只是进口
import 'rxjs/add/operator/map';
重新启动vs代码,问题已解决。
Angular新版本不支持.map,您必须通过cmd npm install --save rxjs-compat来安装。注意:不要忘记导入这些行。
import { Observable, Subject } from 'rxjs';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';