从回调中获取数据

时间:2017-06-01 03:47:26

标签: javascript node.js callback

我正在使用Node.js的“pdf-text”模块将pdf转换为字符串数组,然后从中获取特定元素。但问题是,只有当我在回调中时,我才能访问数据“块”。我想将它存储在一些全局变量中,以便我可以在不同的文件中使用它。我已经尝试在函数内部存储数组的元素,但没有运气。这是代码:

var pdfText = require('pdf-text');

var pathToPdf = "PDF FILE NAME";

var fs = require('fs');
var buffer = fs.readFileSync(pathToPdf);

var output;

pdfText(buffer, function(err, chunks){

    if (err){
      console.dir(err);
      return;
    }
    console.dir(chunks);
    output = chunks;
}

console.dir(output);

P.S。我是Node.js和JavaScript的新手,非常感谢。

先谢谢!

3 个答案:

答案 0 :(得分:1)

  

但问题是,只有当我在回调中时,我才能访问数据" chunks"。

是的,这是正确的。您无法在数据可用之前访问数据,当数据可用时,将使用数据调用您的回调。

  

我想将它存储在一些全局变量中,以便我可以在不同的文件中使用它。

假设你这样做了。现在你有问题了。您在这些不同文件中的代码:如何知道数据准备好了?它赢了。

你需要一些方法来告诉数据准备就绪的代码。通过调用函数来告诉代码的方式。此时您不需要全局变量:当您在其他文件中调用该函数时,您将数据作为函数参数传递给它。

换句话说,不要在某个文件中使用全局代码,希望能够通过引用全局变量来使用chunks数据。而是编写一个可以从回调中调用的函数,并将chunks传递给该函数。

答案 1 :(得分:0)

当调用回调时,输出变量将仅使用“chunks”内容设置。

顺便说一句,你需要添加“);”在pdfText函数调用上的回调函数声明之后。

var pdfText = require('pdf-text');

var pathToPdf = "PDF FILE NAME";
var fs = require('fs');
var buffer = fs.readFileSync(pathToPdf);

var output;

pdfText(buffer, function(err, chunks){

    if (err){
      console.log(err);
      return;
    }
    otherFunction(); // undefined
    output = chunks;
    otherFunction(); // chunks content

});

function otherFunction() {
  console.log(output);
}

console.log(output); // undefined

关于js回调:https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm

答案 2 :(得分:0)

如果您使用的是节点8,我相信您可以使用async-await功能。因此,您可以重构代码,使其如下所示:

var pdfText = require('pdf-text');

var pathToPdf = "PDF FILE NAME";

var fs = require('fs');
var buffer = fs.readFileSync(pathToPdf);

var output;

async function getPDF(buffer) {
  pdfText(buffer, function(err, chunks){
    if (err){
      console.dir(err);
      return;
    }
    return await chunks;
  }
}

// you can get the chunks given the buffer here!
console.dir(getPDF(buffer)); 

  

我想将它存储在一些全局变量中,以便我可以在不同的文件中使用它。我已经尝试在函数内部将数组元素存储在变量中,但没有运气。

我认为您不能将块存储为全局变量,因为您需要export块(例如module.exports = getPDF(buffer);),这是同步的,而函数getPDF是异步的。所以你必须在同一个文件中使用它。我会做的是导入该函数,然后在不同的js文件中传递不同的缓冲区,其中需要不同的pdf。希望这可以帮助。