问题描述
场景是我有文件上传器,它在有文件后接受 .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;
}
}