как обмениваться переменными внутри и вне асинхронных функций?

У меня проблемы с асинхронностью в nodejs. В следующем коде

//Imagine we are inside a function
// many things here before reading a file
 this.data_receiver;    //want to this get file content
 fs.readFile('/data.txt', (err, data) => {
   if (err) throw err;
    //console.log(data);
     this.data_receiver= data;  // get data
});

//I want to process data_receiver
......

Проблема в том, как я могу понемногу получать данные из файла и сохранять их в некоторых переменных, а затем использовать эту переменную снаружи?

Я новичок в этом асинхронном режиме, у меня проблемы.


person arslan    schedule 25.02.2017    source источник
comment
Что вы подразумеваете под получением данных понемногу?   -  person Roumelis George    schedule 25.02.2017
comment
@RoumelisGeorge Я имею в виду, читаю ли я их по частям, а не все сразу.   -  person arslan    schedule 25.02.2017


Ответы (1)


this не привязан к вашей функции внутри обратного вызова. Ты должен сделать:

this.data_receiver;    //want to this get file content
var me = this;
fs.readFile('/data.txt', (err, data) => {
  if (err) throw err;
  //console.log(data);
  me.data_receiver = data;  // get data
});
console.log(this.data_receiver);

Кроме того, речь идет о области обратного вызова. Технически говоря, это «асинхронные функции», но чаще всего «асинхронные функции» связывают с async функциями, например:

async function foo() {
  return Promise.resolve();
}

person unional    schedule 25.02.2017
comment
Если приведенный выше код находится внутри функции. Если бы я хотел использовать this.data_receiver сразу после вызова этой функции, как мне узнать, получил ли this.data_receiver данные? - person arslan; 25.02.2017
comment
Хотя структура является асинхронной (обратный вызов), JavaScript является однопоточным, поэтому обратный вызов вызывается до возврата readFile(). - person unional; 26.02.2017
comment
Я также хочу отметить, что ваше беспокойство является законным. Код работает, потому что он знает что-то неявное — что он работает в среде с одним потоком. Лучшей структурой является использование такой структуры, как Promise. - person unional; 27.02.2017