是否有任何解决方法可以从 readCsv() 方法而不是 undefined 返回 res 的值?

问题描述

场景是我有文件上传器,它在有文件后接受 .json,.csv 文件,如果我点击上传按钮,然后 homeComponent 调用服务数据解析器,它有两个函数 readJson readCsv 和 readcsv 功能 返回可观察的另一个返回数组,这很简单,我必须调用这两个函数
在 if else 上并处理 HomeComponent 上的订阅者和数组 但是等等,我不想在组件级别处理这些复杂性,所以我只想在主页组件页面上返回数据数组,因此,我已经在服务上处理了这些,但在此过程中可以观察到创建问题 >

**dataparser.service.ts having threee methods**

async uploadDocument() {
const type = this.checkType();
if(!type) return;
 let m = type == "csv" ?  await this.readCsv() : await this.readJson();
 if(m){
  console.log(m);
  return m;
}
console.log(" m is empty");
} 

readJson 方法返回对象数组,如果文件类型为 json,则 m 不为空,将 m 返回给 homeComponent 上的调用函数

private  readJson() {
    return new Promise((resolve,reject) =>{
      const fr: FileReader = new FileReader();
      fr.readAsText(this.file);
      fr.onerror = () =>{
        fr.abort();
        reject(new DOMException("Problem parsing input  file."));
      }
      fr.onload = () =>{
        resolve(JSON.parse(fr.result as string));  
      }})
  } 

readCsv 方法由于 subscribe 方法返回空变量(res)是否有任何解决方法可以通过 readCsv 函数获取 res 阀,我不想在任何地方订阅方法,因为我不想处理这些homeComponent 页面上有两个结果,那么我如何从 readCsv 中获取这个 res 变量的值

private async readCsv() {
    let res: any[];
     this.ngxCsvParser.parse(this.file,{ header: this.header,delimiter: ',' })
    .pipe().subscribe((result: Array<any>) => {
 
      // console.log('Result',result);
       res = result;
    },(error: NgxCSVParserError) => {
      console.log('Error',error);
    });
    if(res)
    {
      console.log(" i got m");
      return res;
    } 
  }

解决方法

您不能直接等待 Observables,但是,您可以 await 一个 Promise。您可以简单地对 observables 订阅使用 .toPromise() 方法。考虑以下: const date = await dateSubscription.toPromise();

private async readCsv() {
    let res: any[];
   res= await this.ngxCsvParser.
     parse(this.file,{ header: this.header,delimiter: ',' }).toPromise()
    if(res)
    {
      console.log(" i got m");
      return res;
    } 
  }