【问题标题】:Troubles with pdf.js promisespdf.js 承诺的问题
【发布时间】:2017-03-21 19:45:10
【问题描述】:

我正在尝试在 Javascript 中实现 pdf 字数统计。我遇到了使用 Promise 的 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;
});

}

【问题讨论】:

  • 您需要反转您的流程,即需要 count 的逻辑必须位于遵循此计数计算的“then”中。
  • 我该怎么做?我是否将此方法变成一个对象并在其上调用“then”?这是我从 Spring.io 得到的一些代码,这是你的意思吗? var greetingPromise = sayHello(); greetingPromise.then(function (greeting) { console.log(greeting); // 'hello world' });
  • 类似的东西。基本上,您的计数方法返回一个 Promise(而不是计数本身),计数已解决 (resolve(count))。接下来,向返回的 promise 添加一个 .then 块,并使用 then 块中的 count 做一些事情。
  • 我在哪里返回承诺?我现在在 pdf.then 子句之后添加了以下返回: return Promise.resolve({ then: function(onFulfill, onReject) { onFulfill(count); } });我做错了,因为它返回的计数为 0。抱歉,我没有理解所有内容,我以前从未听说过承诺,文档让我感到困惑而不是开明,感谢您帮助我!
  • 好的,等我有时间再添加一个简单的代码示例。

标签: promise pdf.js


【解决方案1】:

Promise 不能以同步方式处理。 countWords 不能立即返回值,必须等待内部承诺(一个用于文档,多个用于页面和文本上下文)得到解决。所以 countWords 必须返回一个 Promise 或接受回调。最好的方法是尝试返回并链接 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);
});
&lt;script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"&gt;&lt;/script&gt;

【讨论】:

  • P.S.它与 PDF.js 无关——这就是 ECMAScript Promises 的工作原理
  • 我知道这是一年前的事了,但你不知道这个答案在多大程度上帮助我用 PDF.js 完成了类似的任务。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多