开发者社区 问答 正文

如何通过angular的回调函数设置API响应的格式

我想通过回调函数格式化我的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。

展开
收起
被纵养的懒猫 2019-09-29 18:25:52 797 分享 版权
阿里云 AI 助理回答

根据您的描述,您希望在Angular应用中使用HttpClient获取XML数据,并通过xml2js库将其转换为JSON,然后以回调函数的方式处理响应并在订阅中获取数据。但是,遇到了类型错误,这可能是因为xml2js.parseString不是一个异步可观察对象(Observable),因此不能直接在RxJS的操作符链中使用。

要解决这个问题,您可以将xml2js.parseString的调用封装在一个Promise中,然后再利用RxJS的fromdefer操作符将其转换为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操作符来捕获并处理任何在解析过程中发生的错误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答