Получить данные из обратных вызовов

1

Я использую модуль "pdf-text" для Node.js для преобразования 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);

PS Я новичок в Node.js и JavaScript, и помощь будет очень признательна.

Заранее спасибо!

Теги:
callback

3 ответа

0
Лучший ответ

Выходная переменная будет установлена только с содержимым "кусков" при вызове обратного вызова.

Btw, вам нужно добавить ");" после объявления функции обратного вызова при вызове функции 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

  • 0
    Спасибо большое помогает!
0

Но проблема в том, что я могу получить доступ к данным "куски", только когда я нахожусь в обратном вызове.

Да, это правильно. Вы не можете получить доступ к данным до их доступности, и когда они станут доступными, ваш обратный вызов будет вызван с данными.

Я хочу сохранить его в некоторой глобальной переменной, чтобы я мог использовать его в разных файлах.

Предположим, вы это сделали. Теперь у вас есть проблема. Ваш код в этих разных файлах: как он будет знать, когда данные будут готовы? Это не так.

Вам нужно каким-то образом сообщить этому коду, что данные готовы. Способ, которым вы указываете этот код, - это вызвать функцию. И в этот момент вам не нужны глобальные переменные: когда вы вызываете функцию в этом другом файле, вы передаете ей данные как параметр функции.

Другими словами, не просто иметь глобальный код в каком-то файле, который рассчитывает использовать данные ваших chunks, ссылаясь на глобальную переменную. Вместо этого напишите функцию, которую вы можете вызвать из своего обратного вызова, и передайте chunks в эту функцию.

  • 0
    Спасибо большое помогает! Просто быстрое наблюдение, если я хочу отобразить данные чанков через файл .html, как бы я поступил? Весь этот код входит в функцию, которую я вызываю, внутри функции обратного вызова или есть лучший способ сделать это?
  • 0
    Да, совершенно верно. Вы можете структурировать код так, как хотите. С одной стороны, весь код, который использует ваши данные chunks может быть прямо внутри исходной функции обратного вызова. Или вы можете разбить любую часть этого кода на отдельную функцию, которая может вызвать это. И этот фрагмент кода может вызывать еще одну функцию, возможно, для некоторой повторяющейся задачи. Но во всех случаях код должен находиться в функции, которая вызывается прямо или косвенно из обратного вызова.
0

Если вы используете узел 8, я считаю, что вы можете использовать функцию async-ожидания. Таким образом, вы можете реорганизовать свой код так, чтобы он выглядел следующим образом:

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 файл. Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню