为什么这个承诺没有解决?

时间:2018-01-27 12:51:26

标签: javascript node.js promise

我有一个承诺,即收集文件的元数据,然后使用收集的元数据解析它。以下是我试图获得结果的方法:

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

编辑该条目以显示我现在正在返回gepageno函数的值。

我期待的数据已被记录,但由于accept()而无法使用。任何人都能说出可能出现的问题吗?

2 个答案:

答案 0 :(得分:1)

我试图模拟并解决你的承诺。我发布了伪代码。

  

承诺流程

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

输出

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

答案 1 :(得分:0)

您需要在第三行返回承诺

  return self.getpageno(url).then

访问其最终履行价值。