2016-11-08 96 views
1

我試圖在Javascript中實現pdf字數統計。我遇到了使用承諾的pdf.js。在返回計數之前是否有辦法等到腳本完成?我知道這違背了諾言的想法,但其他的js pdf閱讀器有時會產生一堆亂碼或者什麼都不會返回。在目前形式的功能總是返回0與pdf.js承諾的問題

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; 
}); 

一個字計數}

+0

你需要反轉的流動,即其需要'count'必須在「然後」,它遵循這一數目的邏輯計算。 – Vasan

+0

我該怎麼做?我是否把這個方法變成一個對象並且在它上面調用「then」?這是我從Spring.io獲得的一些代碼,這是你的意思嗎? var greetingPromise = sayHello(); greetingPromise.then(function(greeting){ console.log(greeting); //'hello world' }); –

+0

就是這樣的。基本上,你的計數方法返回一個Promise(而不是計數本身),計數已解決('resolve(count)')。接下來,你爲返回的promise添加一個.then塊,並在then塊中執行count。 – Vasan

回答

3

承諾可以不同步的方式來處理。 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); 
 
});
<script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>

+0

P.S.它與PDF.js無關 - 它是ECMAScript Promises的工作原理 – async5

+0

我知道這是一年前的事,但你不知道這個答案能幫助我用PDF.js完成類似的任務。謝謝! –