Проблема с синтаксисом для обещания JavaScript - PullRequest
0 голосов
/ 18 февраля 2019

Я использую 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.log(pdfPagesInfo);

                    resolve();
                }, function () {
                    console.log('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() {
    ....
}

То, что я хочу, - это "continueAndCheckOnServer ()", который будет выполнен, когда все детали были извлечены из "getImageUrl ()".Но в настоящее время выполнение напрямую переходит к «progressAndCheckOnServer ()», не дожидаясь разрешения обещания из «getDataUrlsAndSizesFromPdf».Я новичок в обещаниях JavaScript.Пожалуйста, помогите мне с синтаксисом.

1 Ответ

0 голосов
/ 18 февраля 2019

Вы вызываете свою функцию вместо использования функции обратного вызова.

proceedAndCheckOnServer вызывается, и результат этой функции используется в качестве параметра для then.

getDataUrlsAndSizesFromPdf(file).then(proceedAndCheckOnServer(file));

Попробуйте выполнить одно из следующих действий:

getDataUrlsAndSizesFromPdf(file).then(()=>proceedAndCheckOnServer(file));
getDataUrlsAndSizesFromPdf(file).then(function(){ proceedAndCheckOnServer(file) });

Или разрешите свое обещание getDataUrlsAndSizesFromPdf с помощью file и используйте функцию без () для передачи результата.

getDataUrlsAndSizesFromPdf(file).then(proceedAndCheckOnServer);
...