angular - 在打印和下载 pdf 时显示微调器
问题描述
我想在客户端等待后端发送带有base64string的响应时显示微调器,然后将其显示为像pdf一样打印。我在 Angular 应用程序中为此使用了简单的 JavaScript。微调器的所有逻辑都已实现。问题是当我调用 print 方法时,它看起来发生得非常快,或者没有等待 foreach 循环完成。如果我评论 foreach 逻辑并删除 false 以结束微调器正在工作。
print() {
//Must start spinner
this.sharedService.loadingSpinner = true;
selectedDocuments.forEach((x) => {
this.calculator.printPolicy(policyId, x).subscribe((res) => {
const base64str = res["bBlob_PDF"];
const binary = atob(base64str.replace(/\s/g, ""));
const len = binary.length;
const buffer = new ArrayBuffer(len);
let view = new Uint8Array(buffer);
for (let i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i);
}
let theBlob = new Blob([view], { type: "application/pdf" });
let URLObject = URL.createObjectURL(
new Blob([view], { type: "application/pdf" })
);
window.open(URLObject, "_blank");
let a = document.createElement("a");
a.href = URLObject;
a.download = "MyHome_" + policyId + ".pdf";
//a.click();
});
});
//Must stop the spinner when all is finished
this.sharedService.loadingSpinner = false;
this.hasBeenPrinted = true;
}
解决方案
您可以通过使用 将所有打印可观察对象链接在一起来实现这一点forkJoin
,然后订阅其可观察对象,该可观察对象仅在所有子可观察对象完成后才会发出值,您可以在此订阅函数中停止微调器。
尝试以下操作:
print() {
//Must start spinner
this.sharedService.loadingSpinner = true;
forkJoin(
selectedDocuments.map((x) =>
this.calculator.printPolicy(policyId, x).pipe(
tap((res) => {
const base64str = res['bBlob_PDF'];
const binary = atob(base64str.replace(/\s/g, ''));
const len = binary.length;
const buffer = new ArrayBuffer(len);
let view = new Uint8Array(buffer);
for (let i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i);
}
let theBlob = new Blob([view], { type: 'application/pdf' });
let URLObject = URL.createObjectURL(
new Blob([view], { type: 'application/pdf' })
);
window.open(URLObject, '_blank');
let a = document.createElement('a');
a.href = URLObject;
a.download = 'MyHome_' + policyId + '.pdf';
//a.click();
})
)
)
).subscribe(() => {
// Stop the spinner when all is finished
this.sharedService.loadingSpinner = false;
this.hasBeenPrinted = true;
});
}
推荐阅读
- javascript - 如何将编辑器添加到特定选项卡的整个工作表保护?
- qt - QT QVulkanWindow 覆盖小部件
- android - 如何在命令行中为服务应用程序从 C++ 源代码构建 apk 包
- git - 默认情况下 git 跟踪分支
- python - 使用 Pyqt Print 支持但出现错误“对象不可调用”
- java - 为什么我不能从泛型参数访问属性?
- angular - 如何验证 Angular 2 表单
- android - 从 Firebase 检索数据时的应用加载程序文本
- neo4j - 具有 2 种节点类型的 neo4j 社区检测
- centos7 - 从 PHP 使用 OpenLDAP 进行身份验证