2014-09-29 3 views
-2

Я использую pdf.js для извлечения текстового содержимого из PDF, который я буду использовать дальше для некоторых более обработки, для этого,Проверьте, завершено ли обещание в Javascript?

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 возвращает обещания, и они выполняются асинхронно, однако мне нужно выполнить некоторую пост-обработку по возвращенному тексту. Для этого мне нужно подождать, пока обещания будут полностью выполнены, и только потом перейдем. Как добиться этого? Пожалуйста помоги.

+4

Это ваш ** 13-й вопрос **. К настоящему времени вы должны форматировать вещи разумно, не спрашивая, проверяя результаты в области предварительного просмотра, прежде чем нажимать кнопку «Отправить вопрос». –

+0

Собственные JavaScript-обещания не предоставляют синхронный API проверки, и вы редко _need_ один. Вместо этого вы можете использовать '. Then', чтобы добавить обработчик, который будет запускаться, когда код будет завершен. Если вы отформатируете свой код, я отправлю ответ, поэтому, пожалуйста, сделайте это. –

+2

Я попытался исправить форматирование, но синтаксис неправильный, вы можете исправить брекеты самостоятельно, пожалуйста, – Undefined

ответ

1

Мы можем использовать гораздо более прямой подход, нет необходимости в счетчиках и т.д.

две вещи - обещает цепи, и ожидание многочисленных обещаний делается с 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.all, чтобы подождать нескольких обещаний.

В вашем случае код должен выглядеть

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