David J.
David J.

Reputation: 1913

why isn't this promise resolving?

I have a promise that is meant to collect metadata on a file and then resolve it with the metadata that was collected. Here is how I am trying to get its result:

getMetadata: function(text, url){
    return this.getpageno(url).then(function(pagecount){
        return new Promise(function(accept, reject){
        var result = []
        var dataMatch = rx.exec(text)
        var produktDaten = dataMatch[1].split("&&&").filter(Boolean);
        var dokuArr = dataMatch[2].split("&&&").filter(Boolean);
        console.log('the produktdaten are ' + produktDaten)
        for (var i=0; i<produktDaten.length; i+=4){
            var entry = {}
            for(var j=0; j<dokuArr.length; j+=3){

            var seite = dokuArr[j+2];
            // make sure seite is a digit
            if (!(/^\d+$/.test(seite))){
                console.log(seite + ' was not a valid page number')
                throw err
            }
            if (/(A|a)lle?/i.test(nummer)){
                    entry.kks.pages[beschreibung] = seite;

                //          })
            }
            else if (nummer === kksNummer) {
                entry.kks.pages[beschreibung] = seite;
            }
            }
            entry.hersteller = produktDaten[i+1]
            entry.typ = produktDaten[i+2]
            entry.artikelNummer = produktDaten[i+3]
            result.push(entry)
        }
        if (result.length>0){
            return accept(result)
        }
        return reject()
        })
    })
    },
    getpageno: function(url){
    var self=this
    var pdf = pdfjs.getDocument(url);        
    return pdf.then(function(pdf){       
        var maxPages = pdf.pdfInfo.numPages;
        var countPromises = []; // collecting all page promises
        for (var j = 1; j <= maxPages; j++) {
        try {
            var page = pdf.getPage(j);
            var txt = "";
            countPromises.push(page.then(function(page) { // add page promise
            var textContent = page.getTextContent();
            return textContent.then(function(text){ // return content promise
                return text.items.map(function (s) { return s.str; }).join('&&&'); // value page text 
            });
            }));
        }
        catch(e){
            console.log(e)
        }
        }
        // Wait for all pages and join text
        return Promise.all(countPromises).then(function (texts) {
        // since doumentation pages do not add the final '&&&', must add one manually (only after rx has been found)
        var fulltext = texts.reduce(function(full, text){                        
            if (rx.test(full)){
            var next = '&&&'+text
            return full+=next
            }
            return full+=text            
        }, '')
        return [fulltext, texts]
        });      
    }).then(function(textarr){
        var fulltext = textarr[0]
        self.fulltext = fulltext;        
        var texts = textarr[1]
        try {
        var partialmatch = rx.exec(fulltext)[0]         
        var count = texts.reduce(function(pageno, text){
            var tomatch = text.replace(/.*Typ&&&/, '')
            if (tomatch.length>0 && partialmatch.indexOf(tomatch) > -1){
            pageno++
            }
            return pageno;
        }, 0)
        }
        catch(e){
        console.log(e)
        }
        return count;
    })
    }

Edited the entry to show that I'm now returning the value of the gepageno function.

The data that I am expecting is logged but not available as a result of accept(). Can anyone tell what could be going wrong?

Upvotes: 0

Views: 55

Answers (2)

Dipak
Dipak

Reputation: 2308

I have tried to simulate and give a solution of your promise. I have posted pseudo code.

Promise flow

var testFunction = ((result) => {
    return new Promise(function (resolve, reject) {
        var err = null;
        if (!!err) {
            reject(err);
        } else {
            console.log("2. testFunction resolved");
            resolve("Final response");
        }
    });
});

var getpageno = ((url) => {
    return new Promise((resolve, reject) => {
        var err = null;
        if (!!err) {
            reject(err);
        } else {
            console.log("1. getpageno resolved");
            resolve(45);
        }
    });
});
var getMetadata = ((text, url) => {
    console.log("0. getmetadata resolved");
    var self = this;
    getpageno(url)
        .then((pageCount) => {
            console.log("> pageCount :", pageCount);
            return testFunction(pageCount);
        })
        .then((data) => {
            console.log(">", data);
        });
});

getMetadata("hell", "https://www.google.com");

output

0. getmetadata resolved
1. getpageno resolved
> pageCount : 452. testFunction resolved
> Final response

Upvotes: 1

adz5A
adz5A

Reputation: 2032

you need to return the promise on the third line

  return self.getpageno(url).then

to access its eventual fulfillment value.

Upvotes: 0

Related Questions