【问题标题】:Check if a promise finished in Javascript?检查承诺是否在 Javascript 中完成?
【发布时间】:2014-11-24 00:41:43
【问题描述】:

我正在使用 PDF.js 从 PDF 中提取文本内容,接下来我将使用它进行更多处理,为此,

var complete=0;
var full_text="";
var PDF_render = PDFJS.getDocument("x.pdf").then(function(pdf) {
    var page_text = {};
    for (i = 1; i <= pdf.numPages; i++){
        pdf.getPage(i).then( function(page){
           var n = page.pageNumber;
            page.getTextContent().then( function(textContent){
                var page_text_part = "";
                textContent.items.forEach(function (textItem){
                    page_text_part += textItem.str;
                    page_text_part += " ";
                    });
                page_text[n] =  page_text_part + "\n\n";
                ++complete;
                if (complete == pdf.numPages){
                 for( var j = 1; j <= pdf.numPages; j++)
                    full_text += page_text[j];
                }
              });
            });
        }
    });

问题是 PDF.js 返回承诺并且它们是异步执行的,但是我需要对返回的文本执行一些后期处理。为此,我需要等待承诺完全执行,然后才能继续。如何实现这一目标?请帮忙。

【问题讨论】:

  • 这是您的第 13 个 问题。到目前为止,您应该在不被询问的情况下合理地格式化内容,在预览区域检查结果,然后单击“发布问题”按钮。
  • 原生 JavaScript 承诺不公开同步检查 API,您很少需要一个。您可以改为使用.then 添加一个将在代码完成时运行的处理程序。如果你要格式化你的代码,我会发布一个答案,所以请这样做。
  • 我试图修复格式但语法不正确,请您自己修复大括号
  • @BenjaminGruenbaum, T.J. Crowder 对于格式问题,我很抱歉。修复。非常感谢未定义

标签: javascript promise pdf.js


【解决方案1】:

您可以使用 Promise.all 等待多个 Promise 解决。

在你的情况下,代码应该是这样的

PDFJS.getDocument("x.pdf").then(function(pdf) {
    var pages = [];
    for (var i = 1; i <= pdf.numPages; i++) {
        pages.push(pdf.getPage(i).then(function(page) {
            return page.getTextContent();
        }).then(function(textContent) {
            return textContent.items.map(function(textItem){
                return textItem.str;
            }).join(" ") + " \n\n";
        });
    return Promise.all(promises);
}).then(function(page_texts) {
    var full_text = page_texts.join("");
    // now do something with the result
});

【讨论】:

    【解决方案2】:

    我们可以使用更直接的方法,不需要计数器等。

    两件事 - 承诺链,并等待多个承诺通过Promise.all 完成:

    var pdf = PDFJS.getDocument("x.pdf");
    
    pdf.then(function(pdf) { // wait for the PDF to load
        var pages = [];
        for (i = 1; i <= pdf.numPages; i++){ // for each pages
            pages.push(pdf.getPage(i).then(function(page){ // push the promise
                return page.getTextContent();
            }).then(function(textContent){
                var page_text_part = "";
                textContent.items.forEach(function (textItem){
                        page_text_part += textItem.str + " ";
                });
                return page_text_part + "\n\n"; // you can use return values
            }));
        }
        return Promise.all(pages); // wait for all of them to be done
    }).then(function(results){
         // you can access all the results here
         // containing all pages
    });
    

    【讨论】:

      【解决方案3】:

      不幸的是,这个问题在标题中提出了一个问题(如何检查 Promise 是否完成),而在正文中提出了另一个问题(一旦 Promise 完成后如何继续)。 Google 在搜索如何检查 Promise 是否完成时指出了这一点,所以我正在回答标题中的问题。

      要检查承诺是否完成,您可以使用Promise.race - 如果给定非承诺值,它将不会等待待处理的承诺,例如

      const statusOrValue = await Promise.race([myPromise, 'pending']);
      if (statusOrValue === 'pending') {
          // Not yet finished
      }
      

      请注意,此方法异步给出结果 - await 是检查承诺是否完成所必需的。不知道有没有可靠的方法来检查promise是否同步完成。

      【讨论】:

        猜你喜欢
        • 2020-11-06
        • 2016-11-13
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 2022-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多