>Newby 需要错误方面的帮助。我正在通过 http get 请求请求数据。 数据采用 xml 格式。 我需要将其转换为 json 以便在我的 Angular 应用程序中使用。 当我运行以下代码时,我在控制台中收到错误"TypeError this.http.get((.map 不是一个函数。
list() {
return this.http.get(this.apiRoot).map(res => {
let data;
xml2js.parseString( res.toString, function (err, result) {
console.dir(data); // Prints JSON object!
data = result;
});
return data;
})
.subscribe(data => {
console.log(data);
}); }
谢谢
您需要从 rxjs 导入可观察量的操作员映射。
import { map } from 'rxjs/operators';
您需要导入 rxjs 映射运算符。使用现有代码,您可以执行以下操作:
import 'rxjs/add/operator/map';
您还可以导入运算符函数本身。这是首选。请参阅:https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md
import { map } from 'rxjs/operators';
...
return this.http.get(this.apiRoot).pipe(map(res => {
如果您使用的是已弃用的HttpModule
而不是HttpClient
则必须执行其他步骤来获取响应文本:
.pipe(
map(res => res.text()),
如果您使用的是HttpClient
则无需执行此操作。
最后,由于您使用的是不支持承诺或可观察量的xml2js
,因此您必须包装对.parseString
的调用才能将其添加到可观察量流中。幸运的是,RxJS提供了一个包装器函数,可以为您执行此操作:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindNodeCallback。
这里我们使用switcMap
而不是map
因为bindNodeCallback
返回一个可观察量。 switchMap
会为我们压平它。
import { bindNodeCallback } from 'rxjs/observable/bindNodeCallback';
import { switchMap } from 'rxjs/operators';
function list() {
return this.http
.get(this.apiRoot)
.pipe(switchMap(res => bindNodeCallback(xml2js.parseString)(res)))
.subscribe(console.log);
}