在循环中,等待承诺

问题描述 投票:0回答:2

我有一个有点麻烦进入这个全异步的东西。我使用pdf.js来阅读PDF文件的内容。一切正常,但执行顺序是造成我的困扰。这是我的代码:

function getText(data) {
    var contents = [];
    PDFJS.getDocument(data).then(function(pdf) {
        var numPages = pdf.pdfInfo.numPages;
        for (var i = 1; i <= numPages; i++) {
            pdf.getPage(i).then(function(page) {
                page.getTextContent().then(function(content) {
                    contents.concat(content.bidiTexts);
                })
            });
        }
    })
}

这是工作的打算,不过,我想通过contents当所有页面进行处理,其bidiTexts被concated到的内容。如果我只是把一个函数调用contents作为参数,最后收}在此之前它被称为提前。

javascript jquery pdf.js
2个回答
2
投票

尝试使用承诺:

function getText(data) {
    var contents = [];
    var promises = [];

    PDFJS.getDocument(data).then(function(pdf) {
        var numPages = pdf.pdfInfo.numPages;

        for (var i = 1; i <= numPages; i++) {
            var deferred = $.Deferred(); //Create a deferred object
            promises.push(deferred.promise()); //push promise to the list

            pdf.getPage(i).then(function(page) {
                page.getTextContent().then(function(content) {
                    contents.concat(content.bidiTexts);
                    deferred.resolve(); //resolve the deferred object
                })
            });
        }

        $.when.apply($,promises).then(function(){ //callback executed when all deferreds are resolved
            //do your task with contents
        });
    })
}

这仅仅是一个演示如何使用的承诺。在实际应用中,你必须使用deferred.reject照顾的错误,并处理它在第二次回调$.when


-1
投票

您可以使用async/await

async function getText(data) {
    var contents = [];
    var pdf = await PDFJS.getDocument(data);

    var numPages = pdf.pdfInfo.numPages;

    for (var i = 1; i <= numPages; i++) {
      var page = await pdf.getPage(i);
      var content = await page.getTextContent();

      contents.concat(content.bidiTexts);      
    }    
}

需要注意的是getText会返回一个承诺,你可以使用async /await再次访问结果或getText(data).then(result => console.log(result));

如果你想在并行的网页,使用Promise.All然后await.getContent()

async function getText(data) {
  var pdf = await PDFJS.getDocument(data)
  var numPages = pdf.pdfInfo.numPages;

  var promises = [];

  for (var i = 1; i <= numPages; i++) {
    promises.push(pdf.getPage(i));
  }

  var result = await Promise.All(promises)
    .then(pages => pages.map(page => await page.getTextContent()));

  return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.