【问题标题】:Get data out of callbacks从回调中获取数据
【发布时间】:2017-06-01 12:15:26
【问题描述】:

我正在使用 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);

附:我对 Node.js 和 JavaScript 还很陌生,非常感谢您的帮助。

提前致谢!

【问题讨论】:

  • pdfText 可能是某种异步方法。在这种情况下,console.dir(output) 将在 console.dir(chunks) 之前调用。
  • 是的。我想通了。但如果可能的话,我想要一种从 pdfText 中获取数据块的方法。不过谢谢!
  • 您实际上不想从回调中获取数据out;你想让你的数据需要操作进入回调!起初这是一个调整,但它适用于复杂的异步。

标签: javascript node.js callback


【解决方案1】:

当回调被调用时,输出变量只会被设置为“块”内容。

顺便说一句,您需要添加“);”在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】:

但问题是,我只能在回调内部访问数据“块”。

是的,没错。在数据可用之前,您无法访问数据,当数据可用时,您的回调会被数据调用。

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

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

您需要一些方法来告诉代码数据已准备就绪。你告诉代码的方式是调用一个函数。那时您不需要全局变量:当您在另一个文件中调用函数时,您将数据作为函数参数传递

换句话说,不要只在某个文件中包含全局代码,这些文件期望能够通过引用全局变量来使用您的chunks 数据。相反,编写一个函数,您可以从回调中调用它,并将chunks 传递给该函数。

【讨论】:

  • 谢谢你帮了大忙!只是快速跟进,如果我想通过 .html 文件显示块数据,我该怎么做?所有这些代码代码都进入我在回调中调用的函数中还是有更好的方法来做到这一点?
  • 是的,完全正确。您可以根据需要构建代码。在一种极端情况下,所有使用您的chunks 数据的代码可能就在原始回调函数中。或者您可以将该代码的任何部分分解为一个单独的函数,可以调用它。那段代码可能会调用另一个函数,也许是为了一些重复性的任务。但在所有情况下,代码都需要在回调中直接或间接调用的函数中。
【解决方案3】:

如果您使用的是节点 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 是异步的。所以你必须在同一个文件中使用它。我要做的是导入函数,然后在需要不同 pdf 的不同 js 文件中将不同的缓冲区传递给它。希望这可以帮助。

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多