【问题标题】:Returning data from Promise从 Promise 返回数据
【发布时间】:2018-04-07 19:12:04
【问题描述】:

我的主要目标是使用 PDF.js 并将解析后的 PDF 数据发送到前端。 PDF.js 库处理承诺并按页码从文件中返回数据。这就是我的问题所在。我对 Promise 和在其中创建循环以返回数据不是很熟悉。 我目前的代码如下所示:

var pdf = path.join(__dirname, '../../testoutput.pdf');
    pdfJsLib.getDocument(pdf).then(function(doc){
        var promises = [];
        for(i = 1; i <= doc.numPages; i++){
            //promises.push(doc.getPage(i));
            doc.getPage(i).then(function(page){
                promises.push(page.getTextContent());

                var response = [];
                if(i == doc.numPages + 1){
                    var promiseLimiter = promises.length;
                    Promise.all(promises).then(function(data){
                        response.push(data[0]);
                        if(promiseLimiter == doc.numPages){
                            res.status(200).json(response);
                        }
                    })
                }
            })

我正在尝试将 page.getTextContent() 信息推送到数组并将数组作为响应发送,但我知道我这样做是错误的。 在这种情况下,有什么想法可以使循环与 Promise 一起正常工作吗?

【问题讨论】:

  • Promise.all, 必须out of for, whw 已结束且已完成promise arr
  • 什么是getTextContext()
  • getTextContext() 是 PDF.js lib 提供的函数,您可以通过它从 pdf 页面中提取文本数据。它会返回有关单词及其位置和样式的数据。来自那里的数据通常看起来像这样:pastebin.com/tT7gSu2a。这也应该用作承诺 page.getTextContent().then(function(content){//do something with content})

标签: javascript node.js express promise


【解决方案1】:

在我看来你想做这样的事情

var pdf = path.join(__dirname, '../../testoutput.pdf');
pdfJsLib.getDocument(pdf).then(function(doc){
    var promises = [];
    var promiseLimiter ;
    for(i = 1; i <= doc.numPages; i++){
        //promises.push(doc.getPage(i));
        var p = doc.getPage(i).then(function(page){
            return page.getTextContent();

            var response = [];
            if(i == doc.numPages + 1){
                promiseLimiter = promises.length;
            }
        })
        promises.push(p);
    }
    Promise.all(promises).then(function(data){
                    if(promiseLimiter == doc.numPages){
                        res.status(200).json(data);
                    }
                })

【讨论】:

  • 如果你尝试通过 then() 之外的 promises 数组,它是空的。所以基本上你需要用 Promise 实现某种循环并返回数据。这就是我的知识停止的地方。
  • 谢谢你解决了这个问题。 for 循环和 Promise.all 中的 promiseLimiter if 语句是不必要的。当它们被删除时,数据会以正确的方式发送。
  • promise.all 怎么可能是不必要的?
  • 我的意思是 promise.all() 中的 if 语句。
猜你喜欢
  • 2021-03-17
  • 2017-11-16
  • 2020-05-18
  • 1970-01-01
  • 2021-04-20
  • 2017-03-03
  • 2021-12-29
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多