【问题标题】:Calling an observable function twice not work in Angular两次调用可观察函数在 Angular 中不起作用
【发布时间】:2022-01-04 07:08:56
【问题描述】:

我想导入 excel,我使用 SheetJS 来做到这一点。

  getSheet<T>(fileReader: FileReader, headers: string[], index: number): Observable<T[]> {
return new Observable((observer) => {

  fileReader.onload = ((ev: ProgressEvent): void => {
    let workbook;
   .......

    workbook = XLSX.read(binary, { type: 'binary', cellDates: true, cellStyles: true });

    let getData = XLSX.utils.sheet_to_json<T>(workbook.Sheets[workbook.SheetNames[index]], { header: headers, range: 1 });

    observer.next(getData);

    observer.complete();
  })


});  }

在另一个函数中,我称之为 observable 函数。

getExcel(evt: Event) {
const fileReader = new FileReader();

fileReader.readAsArrayBuffer((<any>evt.target).files[0]);

let getdataA$!: Observable<interfaceA[]>
let getdataB$!: Observable<interfaceB[]>
let getdataC$!: Observable<interfaceC[]>

getdataA$ = this.getSheet(fileReader, this.headerA, 0);

getdataB$ = this.getSheet(fileReader, this.headerB, 1);

getdataC$ = this.getSheet(fileReader, this.headerC, 2);

 const observable = forkJoin({
  getdataA$,
  getdataB$,
  getdataC$,
});

}

我使用 RxJS 操作符,例如 forkJoin,combineLatest

但它不起作用............

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您是否订阅了代码中某处的 observable ?
  • 是的,我确实在 forkJoin 方法之后订阅了 observable 变量。我使用 console.log 查看数据。
  • fileReader.onload 是一个异步函数。会影响结果吗?

标签: angular typescript rxjs


【解决方案1】:

访问创建的可观察对象之外的变量是不好的。

在这种情况下,您的fileReadernew Observable(() =&gt; ...) 之外,因此文件只能加载一次。

我认为你必须在new Observable(() =&gt; ...) 中创建 FileReader 实例,这样每次订阅 observable 对象时,都会创建一个新的 FileReader 实例。

下面的简单示例代码:

getSheet<T>(someFile: File, anotherArguments: any): Observable<T[]> {
  return new Observable(observer => {
    // create a new FileReader instance when every Observable has been created
    const fileReader = new FileReader();

    fileReader.onload = () => {
      observer.next();
      observer.complete();
    }

    fileReader.readAsArrayBuffer(someFile);
  }
}

【讨论】:

  • 或者,只是读取getSheet&lt;T&gt;之外的整个文件,然后将二进制文件传递给getSheet&lt;T&gt;
  • 你也可以将整个读取文件任务包装成一个observable,然后切换到另一个observable处理excel内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2017-02-19
  • 1970-01-01
相关资源
最近更新 更多