У меня есть текстовый файл, который просто перечисляет некоторые URL-адреса. Я пытаюсь взять каждую строку из текстового файла и добавить его в массив URL-адресов для дальнейшей работы.NodeJS синхронные функции
var fs = require('fs'),
Urls = [];
var returnURLS = function(file) {
var read = function(callback) {
fs.readFile(file, function(err, logData){
if (err) throw err;
var text = logData.toString();
var lines = text.split('\n');
lines.forEach(function(line, callback){
var url = "http://www." + line;
Urls.push(url);
});
callback();
});
};
var giveBackAnswer = function() {
console.log("1: ", Urls);
return Urls;
};
read(giveBackAnswer);
};
console.log("2: ", returnURLS('textFileWithListOfURLs.txt'));
Моей консоли выход ясно показывает, что операции файловой системы не завершены к тому времени, программа должна записать результаты, но результаты в конце концов, действительно показывают вверх.
2: the urls are undefined
1: [ 'http://www.cshellsmassage.com',
'http://www.darsanamartialarts.com',
'http://www.davidgoldbergdc.com',
'http://www.dayspaofbroward.com',.... (etc)
Каков наилучший способ заставить эти функции работать синхронно? 1) Компиляция массива Urls через операции с файловой системой 2) Вывести массив на консоль, когда он был заполнен
Мне лично нравится использовать библиотеку 'async', в частности функцию [' series'] (https://github.com/caolan/async#seriestasks-callback), которую она предоставляет. Не уверен, что лучше всего. – aug
Если это всего лишь однократная операция, вам просто нужно использовать 'readFileSync'. –
Вы пытаетесь вернуть значение синхронно из операции, которая является асинхронной. Вы просто не можете этого сделать. Данные еще не закончили считываться, когда 'read()' завершает выполнение. Передайте обратный вызов в 'read()' и обработайте данные из обратного вызова. – jfriend00