pdf.js 承诺的问题
Troubles with pdf.js promises
我正在尝试在 Javascript 中实现 pdf 字数统计。我遇到了使用承诺的 pdf.js 。有没有办法在 return 计数之前等到脚本完成?我知道这违背了承诺的想法,但其他 js pdf 阅读器有时会产生一堆乱码或 return 什么也没有。在其当前形式中,函数始终 return 字数为 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;
});
}
无法以同步方式处理承诺。 countWords 不能立即 return 值,必须等待内部承诺(一个用于文档,多个用于页面和文本上下文)得到解决。所以 countWords 必须 return 一个 Promise 或 accept 回调。最好的方法是尝试 return 并链接 then() 调用。需要加入解析时使用Promise.all:
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);
});
<script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>