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

时间:2014-06-12 22:27:44

标签: promise pdf.js

我现在正在尝试将包含多个页面的整个pdf文件呈现到我的网页中,并且一个画布对应于一个页面。虽然我可以在单页翻译之后将代码放在then()Promise中以解决问题,但我发现我无法使用$ .when函数来检测所有页面都已呈现。我目前的解决方案是逐个渲染页面并在最后一页的然后()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

1 个答案:

答案 0 :(得分:2)

这是一个棘手的问题。

jQuery承诺不会吸收其他图书馆的承诺,它们不是Promises / A +投诉,并且它们与其他承诺不能很好地运作。事实上,$.when仅适用于jQuery承诺。

而是本机承诺,或者polyfill PDF.JS为那些,甚至是更有能力的承诺库提供。

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

Promise.all(renderArray);

其他一些提示 - 使用[]代替new Array(做同样的事情),您可能要考虑直接在.mapPromise.all传达意图更好。