【问题标题】:then not working as expected in JS promise然后在 JS 承诺中没有按预期工作
【发布时间】:2018-02-13 16:01:36
【问题描述】:

我正在尝试从 pdf 中提取文本,然后返回一个数字,该数字表示 pdf 有多少页与我定义的正则表达式匹配。

我的问题是,我的函数不是定期检查单个页面的文本是否是匹配的一部分,而是将这些部分分成比页面更小的部分。计数仅在读取整个页面后才会增加。

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


         });             
     }));
}

谁能帮我弄清楚如何重写它,以便 count 正确增加页码?

【问题讨论】:

  • 不清楚全文是在哪里定义的,但看起来它正在以随机顺序从所有页面累积文本(因为对所有页面立即调用 getPage/getTextContent 并且这些以任何顺序解决)
  • @async5 我不小心遗漏了变量声明——只是将它们重新编辑了进去。你能建议一种方法来确保全文以正确的顺序返回文本吗?

标签: javascript regex promise es6-promise pdf.js


【解决方案1】:

我真的不知道代码中的问题出在哪里,但我只是建议您避免使用 promise 进行过多的嵌套。您可以通过如下链接您的承诺来减少嵌套:

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(() => {
            ... 
        });

    });
}

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多