我想通过回调函数格式化我的API响应,并在有角订阅中获取数据
我用过mergemap,但是没用
this.http.get('https://some.com/questions.xml', {headers, responseType: 'text'}) .mergeMap( res => xml2js.parseString(res, { explicitArray: false }, (error, result) => { if (error) { throw new Error(error); } else { console.log(result); return result; } })) .subscribe(data => { console.log("response", data); }, error => { console.log(error); });
我想在订阅中获取响应JSON,但是我遇到了TypeError:您提供了一个无效对象,该对象应该在其中流。您可以提供一个Observable,Promise,Array或Iterable。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的描述,您希望在Angular应用中使用HttpClient获取XML数据,并通过xml2js
库将其转换为JSON,然后以回调函数的方式处理响应并在订阅中获取数据。但是,遇到了类型错误,这可能是因为xml2js.parseString
不是一个异步可观察对象(Observable),因此不能直接在RxJS的操作符链中使用。
要解决这个问题,您可以将xml2js.parseString
的调用封装在一个Promise中,然后再利用RxJS的from
或defer
操作符将其转换为Observable。这样就可以顺利地在RxJS管道中使用了。下面是一个示例代码:
import { HttpClient } from '@angular/common/http';
import { Observable, from } from 'rxjs';
import { mergeMap, catchError } from 'rxjs/operators';
import * as xml2js from 'xml2js';
// 封装xml解析为Promise
function parseXmlToJson(xml: string): Promise<any> {
return new Promise((resolve, reject) => {
xml2js.parseString(xml, { explicitArray: false }, (error, result) => {
if (error) {
reject(error);
} else {
resolve(result);
}
});
});
}
// 在您的服务或组件中
this.http.get('https://some.com/questions.xml', { headers, responseType: 'text' })
.pipe(
mergeMap((res: string) => from(parseXmlToJson(res))), // 将Promise转换为Observable
catchError(error => {
console.error('Error parsing XML:', error);
throw error; // 重新抛出错误以便在subscribe的错误处理中捕获
})
)
.subscribe(
data => {
console.log("response", data);
},
error => {
console.log(error);
}
);
这段代码首先定义了一个parseXmlToJson
函数,它接收XML字符串并返回一个Promise,该Promise在解析完成时解析结果或错误。然后,在HTTP请求之后,使用mergeMap
操作符和from
函数将这个Promise转换为Observable。这样,您就可以在订阅中正确地处理转换后的JSON数据了。同时,使用catchError
操作符来捕获并处理任何在解析过程中发生的错误。