Я использую pdfjs для чтения файла PDF и получения его страниц в виде изображений. После того, как все изображения загружены, мне нужно вызвать ajax для отправки и получения сведений с сервера. Код для перебора страниц в pdf взят отсюда: https://ourcodeworld.com/articles/read/405/how-to-convert-pdf-to-text-extract-text-from-pdf-with-javascript
У меня возникли проблемы с написанием синтаксиса для обещания, которое вызовет функцию ajax после получения всех необходимых деталей, упомянутых выше.
Вот мой код:
getDataUrlsAndSizesFromPdf(file).then(proceedAndCheckOnServer(file));
const getDataUrlsAndSizesFromPdf = function(file) {
PDFJS.disableWorker = true;
fileReader = new FileReader();
fileReader.readAsArrayBuffer(file);
return new Promise(function(resolve, reject) {
fileReader.onload = function(ev) {
PDFJS.getDocument(fileReader.result).then(function (pdf) {
var pdfDocument = pdf;
var pagesPromises = [];
for (var i = 0; i < pdf.pdfInfo.numPages; i++) {
var pageNum = i + 1;
pagesPromises.push(getImageUrl(pageNum, pdfDocument));
}
Promise.all(pagesPromises).then(function () {
console.info(pdfPagesInfo);
resolve();
}, function () {
console.info('failed');
reject();
});
}, function (reason) {
console.error(reason);
});
}
});
}
function getImageUrl() {
return new Promise(function (resolve, reject) {
PDFDocumentInstance.getPage(pageNum).then(function (pdfPage) {
var scale = 1;
var viewport = pdfPage.getViewport(scale);
var canvas = document.getElementById('dummy-canvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
var task = pdfPage.render({canvasContext: context, viewport: viewport})
task.promise.then(function(){
var sizesArr = {
height : viewport.height,
width : viewport.width
}
pdfPagesInfo.sizes[pageNum.toString()] = sizesArr
pdfPagesInfo.images[pageNum.toString()] = canvas.toDataURL('image/jpeg');
resolve();
});
});
});
}
function proceedAndCheckOnServer() {
....
}
Я хочу, чтобы «proceedAndCheckOnServer()» выполнялся, когда все детали были получены из «getImageUrl()». Но в настоящее время выполнение напрямую переходит к «proceedAndCheckOnServer()», не дожидаясь разрешения обещания от «getDataUrlsAndSizesFromPdf». Я новичок в обещаниях javascript. Пожалуйста, помогите мне с синтаксисом.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы вызываете свою функцию вместо использования функции обратного вызова.
proceedAndCheckOnServer вызывается, и результат этой функции используется в качестве параметра для then.
getDataUrlsAndSizesFromPdf(file).then(proceedAndCheckOnServer(file));
Попробуйте один из них:
getDataUrlsAndSizesFromPdf(file).then(()=>proceedAndCheckOnServer(file));
getDataUrlsAndSizesFromPdf(file).then(function(){ proceedAndCheckOnServer(file) });
Или выполните обещание getDataUrlsAndSizesFromPdf с помощью file и используйте функцию без () для передачи результата.
getDataUrlsAndSizesFromPdf(file).then(proceedAndCheckOnServer);
Виноват. Я не замечал этого раньше.
Избегайте
Promiseконструктор антипаттерн! (Вам нужен толькоnew PromiseвокругfileReader.onload =, например здесь или там)