promise - 如何检测多个pdf.js渲染任务已完成

标签 promise pdf.js

我现在正在尝试将包含多个页面的整个 pdf 文件渲染到我的网页中,并且一个 Canvas 对应于一页。虽然我可以将代码放入 then() Promise 中以解决单页渲染后的问题,但我发现无法使用 $.when 函数来检测所有页面都已渲染。我当前的解决方案是逐个渲染页面并在最后一页的 then() Promise 中运行我的代码。希望还有其他解决方案!

谢谢!

这是不起作用的代码:

var renderArray = new Array();
for (var pageNo = 0; pageNo < pdfPageArray.length; pageNo++)// All pages extracted by PDF.JS are stored in pdfPageArray
{
    var page = pdfPageArray[pageNo];
    var viewport = page.getViewport(printScale);
    var canvas = document.createElement('canvas');
    $(canvas).css({width:"100%",height:"100%"});
    var outputScale = getOutputScale(context);
    canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
    canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
    $(printPageDiv).append(canvas);
    var context = canvas.getContext("2d");
    var renderContext = {
        canvasContext: context,
        viewport: viewport
    };
    renderArray.push(page.render(renderContext));

}
return $.when.apply($, renderArray);//It seems this when function doesn't work

最佳答案

这是一个棘手的问题。

jQuery promise 不会同化其他库的 promise ,它们不是 Promises/A+ 的提示,并且它们不能与其他 promise 很好地互操作。事实上 $.when 仅适用于 jQuery Promise。

取而代之的是原生 Promise,或者 PDF.JS 提供的 Polyfill,甚至是功能更强大的 Promise 库。

$.when.apply($, renderArray) 更改为:

Promise.all(renderArray);

其他一些技巧 - 使用 [] 而不是 new Array (做同样的事情),您可能需要考虑做一个 .map 直接进入 Promise.all 以更好地传达意图。

关于promise - 如何检测多个pdf.js渲染任务已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24194871/

相关文章:

javascript - Promise.all 每次处理一组 6 个 promise

javascript - 为什么 Promise 在 Node.js 中返回(解析)一个空对象?

javascript - pdf.js:获取文本颜色

javascript - 从 PDF.JS pdf 转换为 Canvas 标签获取 base64 png?

javascript - 按顺序执行多个 Promise(概念)

javascript - 如何让 Javascript 函数在另一个函数完成后触发?

javascript - 如何在 NodeJs 中手动更新多个 Mongo 文档?

javascript - PDF.JS 在客户端预览从服务器端发送的大型 pdf 文件(> 200MB)

javascript - 如何使用 pdf.js 呈现 pdf 文件?

javascript - 为什么 IE 在解码 Base64 时给出中文/普通话字符?