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);
}); }
由于
答案 0 :(得分:0)
您需要从rxjs导入observables的运算符映射。
import { map } from 'rxjs/operators';
答案 1 :(得分:0)
您需要导入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
不支持Promises或Observable,因此您必须将调用包装到.parseString
以将其添加到可观察流中。幸运的是,RxJS提供了一个包装函数,可以为您执行此操作:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindNodeCallback。
我们在这里使用switcMap
代替map
,因为bindNodeCallback
会返回一个observable。 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);
}