fix: 修复桌面 DOCX 媒体捕获超时
This commit is contained in:
@@ -74,24 +74,55 @@ export interface PreviewEngineStyles {
|
||||
echartsCss: string;
|
||||
}
|
||||
|
||||
function waitForImages(container: ParentNode) {
|
||||
const images = Array.from(container.querySelectorAll("img"));
|
||||
return Promise.all(
|
||||
images.map(async (image) => {
|
||||
if (image.complete) {
|
||||
export const DEFAULT_IMAGE_READY_TIMEOUT_MS = 10_000;
|
||||
|
||||
function waitForImage(
|
||||
image: HTMLImageElement,
|
||||
timeoutMs: number
|
||||
) {
|
||||
if (image.complete) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return new Promise<void>((resolve) => {
|
||||
let settled = false;
|
||||
const finish = () => {
|
||||
if (settled) {
|
||||
return;
|
||||
}
|
||||
settled = true;
|
||||
clearTimeout(timeout);
|
||||
image.removeEventListener("load", finish);
|
||||
image.removeEventListener("error", finish);
|
||||
resolve();
|
||||
};
|
||||
const timeout = window.setTimeout(finish, timeoutMs);
|
||||
|
||||
try {
|
||||
await image.decode();
|
||||
} catch {
|
||||
await new Promise<void>((resolve) => {
|
||||
image.addEventListener("load", () => resolve(), { once: true });
|
||||
image.addEventListener("error", () => resolve(), { once: true });
|
||||
});
|
||||
// 先监听事件,再检查 complete 和调用 decode,避免 Electron 中图片
|
||||
// 已经失败后才注册 error 监听器而永久等待。
|
||||
image.addEventListener("load", finish, { once: true });
|
||||
image.addEventListener("error", finish, { once: true });
|
||||
if (image.complete) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
void image.decode().then(finish, () => {
|
||||
// decode 失败时仍允许尚未到达的 load/error 事件完成等待;若事件
|
||||
// 已经发生,complete 会立即结束。最终由有界超时兜底。
|
||||
if (image.complete) {
|
||||
finish();
|
||||
}
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function waitForImages(
|
||||
container: ParentNode,
|
||||
timeoutMs = DEFAULT_IMAGE_READY_TIMEOUT_MS
|
||||
) {
|
||||
const images = Array.from(container.querySelectorAll("img"));
|
||||
return Promise.all(images.map((image) => waitForImage(image, timeoutMs)));
|
||||
}
|
||||
|
||||
function stylesheet(
|
||||
|
||||
Reference in New Issue
Block a user