2017-09-05 104 views
0

我試圖從PDF中提取文本,然後返回一個數字,表示有多少頁的pdf由我定義的正則表達式匹配。然後不按預期工作在JS承諾

我的問題是,與其定期檢查單個頁面的文本是否爲匹配的一部分,我的功能將這些部分分成比頁面小的部分。計數只能在整個頁面被讀取後才增加。

getnopages: function(){ 
    var fulltext = "" 
    var partialmatch;  
    var somerx = /something/ 
    return pdfjs.getDocument(data).then(function(pdf) { 
    var pages = []; 
    pageNumbers = []; 
    for (var i = 0; i <= 6; i++) { 
     pages.push(i); 
    } 
    var found = false; 
    var count = 1; 
    return Promise.all(pages.map(function(pageNumber) { 
     pageNumbers.push(pageNumber); 

     return pdf.getPage(pageNumber + 1).then(function(page) 

      return page.getTextContent().then(function(textContent) { 
       return textContent.items.map(function(item) { 
        fulltext+=item.str+'&&&'; 

        return item.str; 
       }).join('&&&'); 
      }); 
     }).then(function(){ 
      count++; 
      console.log('the count is ' + count) 
      var partialmatch; 
      try { 
       partialmatch = fulltext.match(somerx)[0] 
       console.log('the match: ' + partialmatch) 
       var full = fulltext.slice(0, fulltext.length-3) 
      console.log('the full text ' + full) 
      if (fulltext && partialmatch!==full && !found){ 
      found = true; 
      console.log('now we found our number: ' + count) // this finds where the full text differs from the partial text but returns a number too large to be a page number 
      }     
     } 
     catch(e){ 
      console.log(e) 
     }        


     });    
    })); 
} 

任何人都可以幫助我弄清楚如何重寫這個,以便計數正確遞增頁碼?

+0

目前尚不清楚其中的全文定義,但看起來像是從隨機順序的所有頁面累計文本(因爲GETPAGE/getTextContent調用一次爲所有頁面,這些以任何順序解決) – async5

+0

@ async5我遺漏了變量聲明 - 只是重新編輯它們。你能否建議一種方法來確保全文以正確的順序返回文本? –

回答

1

我真的不知道代碼中的問題在哪裏,但我建議您避免使用承諾過多嵌套。您可以通過鏈接你的承諾像下面減少嵌套:

getnopages: function() { 

    var somerx = /something/ 

    return pdfjs.getDocument(data).then(function(pdf) {  

     var pages = []; 
     pageNumbers = []; 
     for (var i = 0; i <= 6; i++) { 
      pages.push(i); 
     } 
     var found = false; 
     var count = 1; 

     var promises = pages.map(pageNumber => { 
      pageNumbers.push(pageNumber); 
      return pdf.getPage(pageNumber + 1).then(page => { 
       return page.getTextContent(); 
      }).then(textContent => { 
       return textContent.items.map(item => { 
        fulltext += item.str +'&&&'; 
        return item.str; 
       }).join('&&&'); 
      }); 
     }); 
     return Promise.all(promises).then(() => { 
      ... 
     }); 

    }); 
}