我有一个有点麻烦进入这个全异步的东西。我使用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
作为参数,最后收}
在此之前它被称为提前。
尝试使用承诺:
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
您可以使用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;
}