angular - 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 并使用并返回一个类成员变量,但没有任何效果。
解决方案
我不确定您为什么将其用作承诺,因此我将所有内容都保留为可观察的直到最后。
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');
请注意,您的承诺永远不会被完全履行,如果您需要,那么您应该删除过滤器并抛出异常或类似情况。
我建议将其用作可观察的而不是承诺。
推荐阅读
- junit - Junit:注入依赖项
- java - 使用 JPA 2.0 Criteria API 对 Long 值执行类似操作
- apostrophe-cms - ApostropheCMS 中的第三方地图
- android - 导入到 Samsung Health 的数据不会显示在应用程序中,但会导入到 HealthDataStorage
- html - 如何更改 HTML 标题元素的工具提示文本?
- reactjs - 有什么区别
和组件()? - azure-stream-analytics - 有没有办法确定作业运行的“起点”?
- javascript - 如何通过按 React-Native 中的一个抽屉项目从抽屉导航移到上一个屏幕?
- spring-cloud-stream - Spring Kinesis Binder 快速填充堆空间导致频繁的 GC 刷新并减慢消息处理
- javascript - 除了 react-native-background-task 之外,还有其他方法可以在 React Native 中执行后台任务吗?