与pdf.js承诺的麻烦

时间:2016-11-08 08:51:41

标签: promise pdf.js

我试图在Javascript中实现pdf字数统计。我遇到了使用promises的pdf.js。有没有办法在返回计数之前等到脚本完成?我知道这违背了承诺的想法,但其他js pdf读者有时会产生一堆乱码或什么也不返回。在当前形式中,该函数始终返回字数为0.

function countWords(pdfUrl){
var pdf = PDFJS.getDocument(pdfUrl);
var count = 0;
pdf.then(function(pdf) {
     var maxPages = pdf.pdfInfo.numPages;
     for (var j = 1; j <= maxPages; j++) {
        var page = pdf.getPage(j);

        var txt = "";
        page.then(function(page) {
            var textContent = page.getTextContent();
            textContent.then(function(page){

            for(var i=0;i<page.items.length;i++){
                txtadd = page.items[i].str
                txt += txtadd.replace(/[^a-zA-Z0-9:;,.?!-() ]/g,'');
            }
                count = count + txt.split(" ").length;

            })
        })
     }
     return count;
});

}

1 个答案:

答案 0 :(得分:5)

无法以同步方式处理Promise。 countWords不能立即返回值,必须等待内部promise(一个用于文档,一个用于页面和文本上下文)来解析。因此countWords必须返回Promise或接受回调。最好的方法是尝试返回和链接then()调用。当需要加入解决方案时,请使用Promise.all:

&#13;
&#13;
function countWords(pdfUrl){
var pdf = PDFJS.getDocument(pdfUrl);
return pdf.then(function(pdf) { // calculate total count for document
     var maxPages = pdf.pdfInfo.numPages;
     var countPromises = []; // collecting all page promises
     for (var j = 1; j <= maxPages; j++) {
        var page = pdf.getPage(j);

        var txt = "";
        countPromises.push(page.then(function(page) { // add page promise
            var textContent = page.getTextContent();
            return textContent.then(function(page){ // return content promise

            for(var i=0;i<page.items.length;i++){
                txtadd = page.items[i].str
                txt += txtadd.replace(/[^a-zA-Z0-9:;,.?!-() ]/g,'');
            }
                return txt.split(" ").length; // value for page words

            });
        }));
     }
     // Wait for all pages and sum counts
     return Promise.all(countPromises).then(function (counts) {
       var count = 0;
       counts.forEach(function (c) { count += c; });
       return count;
     });
});
}
// waiting on countWords to finish completion, or error
countWords("https://cdn.mozilla.net/pdfjs/tracemonkey.pdf").then(function (count) {
  alert(count);
}, function (reason) {
  console.error(reason);
});
&#13;
<script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>
&#13;
&#13;
&#13;