首页 > 解决方案 > Observable 中的承诺:无法返回数据

问题描述

我正在使用 Angular 7 和 Typescript,我正在尝试读取 zip 文件中的 json 文件。我可以在控制台上打印正确的 json 输出,但我无法从该函数返回 json 数据。我正在使用另一个服务和一个 observable 下载 zip 文件,在这个 observable 中我使用一个 promise(这就是 JSZip 库提供的)来提取 zip 文件并读取我的 json 文件的数据。函数代码如下:

提取-zip.service.ts:

async getJSONfromZip(zip_filename: string, json_filename: string) {
    return this.fileService.downloadResource(zip_filename)
    .pipe(
      map (async (data: any) => {
        return JSZip.loadAsync(data)
          .then((zip: any) => {
            Object.keys(zip.files)
            // iterate over all containing files
            .forEach((filename) => {
            // look for json file
            if (filename === json_filename) {
              return zip.files[filename].async('string')
                .then((fileData: any) => {
                  console.log(fileData);

                  return fileData;
              });
            }
          });
      });
    }))
    .toPromise();
  }

它返回一个 Promise,但我想返回 json 文件(fileData)的内容。我怎样才能做到这一点?我尝试将其转换为 Promise 并使用并返回一个类成员变量,但没有任何效果。

标签: angulartypescript

解决方案


我不确定您为什么将其用作承诺,因此我将所有内容都保留为可观察的直到最后。

async getJSONfromZip(zip_filename: string, json_filename: string) {
    return this.fileService
      .downloadResource(zip_filename)
      .pipe(
        switchMap(data => from(JSZip.loadAsync(data))), // make the promise a observable
        map(zip => {
          const fileNames = Object.keys(zip.files);
          const fileExist = zipFiles.find( fileName => fileName === json_fileName);
          if (fileExist) {
            return zipFiles[fileName];
          } else {
            return undefined;
          }
        }),
        filter(zipFile => zipFile), // do not process anything if the file is not found
        switchMap(zipFile => from(zipFile.async('string')))
      )
      .toPromise();
  }

const myJson = await getJSONfromZip('something.zip', 'json_name.json');

请注意,您的承诺永远不会被完全履行,如果您需要,那么您应该删除过滤器并抛出异常或类似情况。

我建议将其用作可观察的而不是承诺。


推荐阅读