0

Написал код для открытия текстового файла:

var log_txt = new XMLHttpRequest();
var online_txt;
log_txt.open("GET","log.txt");
log_txt.send();
//log_text.onload = log_txt_func(online_txt);
var online_txt = log_txt_func(online_txt);
console.log(log_txt_func(online_txt));
//console.log(date_txt);
function log_txt_func(online_txt) {
    log_txt_arr = log_txt.responseText.split("\r\n");
    log_txt_arr.forEach(date_txt_arr);
    log_txt_arr.forEach(online_txt_arr);
    var date_txt = date_txt.split(",");
    var online_txt = online_txt.split(",");
    online_txt.splice(0, 1);
    date_txt.splice(0, 1);
        function date_txt_arr(value){
            date_txt = date_txt + value.split(" ==> ")[0] + ',';
        }
        function online_txt_arr(value){
            online_txt = online_txt + value.split(" ==> ")[2] + ',';
        }
    //console.log(online_txt);
    //console.log(date_txt);
    return online_txt;
    //return date_txt;
}

document.addEventListener("DOMContentLoaded", function(){
    let online = new liteChart("chart");
    online.setLabels(date_txt);
    online.addLegend({"name": "Online", "stroke": "#3759d7", "fill": "#fff", "values": online_txt});
    let div = document.getElementById("online");
    online.inject(div);
    online.draw();
});

Подскажите пожалуйста, как можно вывести переменные online_txt и date_txt за пределы функции? Внутри функции log_txt_func() всё работает на ура, а за пределами не получается? После вывода данных мне нужно их передать в следующую функцию, для составления графика

Yaant
  • 4,392
opiums
  • 85

2 Answers2

0

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

const dateTxtArr = [];
const onlineTxtArr = [];

async function logTxt(){
    let data = await fetch('log.txt');

    const logTxtArr = data.split("\r\n");

    for (const value of logTxtArr){
        const arr = value.split(' ==> ');
        dateTxtArr.push(arr[0]);
        onlineTxtArr.push(arr[2]);
    }
}

document.addEventListener("DOMContentLoaded", async function(){
    await logTxt()
    let online = new liteChart("chart");
    online.setLabels(dateTxtArr);
    online.addLegend({"name": "Online", "stroke": "#3759d7", "fill": "#fff", "values": onlineTxtArr});
    let div = document.getElementById("online");
    online.inject(div);
    online.draw();
});
Shiki
  • 574
  • Соглашусь с @Shiki, код выглядит, как тренажёр для рефакторинга. – V-Mor Jul 16 '19 at 13:52
  • В данном варианте говорит Uncaught TypeError: Cannot read property 'split' of undefined и ссылается на 9-ю строку этого кода – opiums Jul 16 '19 at 14:04
  • покажите ваш log.txt файлик – Shiki Jul 16 '19 at 14:07
  • @opiums по идее пофиксил – Shiki Jul 16 '19 at 14:09
  • 09.02.2019 15:55:27 ==> 1.236.16.1 ==> 6 09.02.2019 15:55:29 ==> 46.22.16.2 ==> 6 09.02.2019 15:55:30 ==> 46.22.10.4 ==> 6 ... Примерно так – opiums Jul 16 '19 at 14:10
  • там в названии пропа была ошибка logTxt вместо logTxtReq cтоял – Shiki Jul 16 '19 at 14:10
  • Нашёл, lconst logTxtArr = logTxtReq.responseText.split("\r\n"); – opiums Jul 16 '19 at 14:12
  • Всё таки тоже что то не так... [""] [undefined] - всё что выводится в консоли – opiums Jul 16 '19 at 14:14
  • у тебя где-то \r\n стоит вообще? – Shiki Jul 16 '19 at 14:17
  • 09.02.2019 15:55:27 ==> 1.236.16.1 ==> 6\r\n 09.02.201915:55:29 ==> 46.22.16.2 ==> 6\r\n 09.02.2019 15:55:30 ==> 46.22.10.4 ==> 6\r\n ... – opiums Jul 16 '19 at 14:19
  • Странно, если на нативном js запустить с этим текстом - все нормально, выводит [ '09.02.2019 15:55:27', ' 09.02.201915:55:29', ' 09.02.2019 15:55:30' ] [ '6', '6', '6' ] – Shiki Jul 16 '19 at 14:22
  • Сейчас еще раз прорефакторю, с fetch попробуйте – Shiki Jul 16 '19 at 14:23
  • На каких браузерах должно работать? залил сюда для теста всё: https://opiums.eu/chart/chart.html и заодно файл можно посмотреть – opiums Jul 16 '19 at 14:33
  • А где находится сам файл log.txt – Shiki Jul 16 '19 at 14:36
  • там же, в той же директории – opiums Jul 16 '19 at 14:36
  • Странно, почему-то 304 отдает на запрос – Shiki Jul 16 '19 at 14:39
  • https://opiums.eu/chart/log.txt не должно – opiums Jul 16 '19 at 14:40
  • Я поправил код, нашёл как вывести массив, но он теперь очень странный, и кроме того получаю что то типа ошибки "value below was evaluated just now", пока что решения не нашёл... – opiums Jul 16 '19 at 16:58
0

Объявите эти переменные глобально и передавайте в функцию в качестве аргументов.

V-Mor
  • 5,127
  • Каков тогда будет рабочий пример? – opiums Jul 16 '19 at 13:06
  • @opiums Поясните, Вы хотите, чтобы заработало то, что закомментировано в Вашем коде? – V-Mor Jul 16 '19 at 13:11
  • 1
    добро пожаловать на stack overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав [edit] – aleksandr barakin Jul 16 '19 at 13:11
  • Я хочу чтобы за пределами функции я мог использовать console.log(online_txt) и console.log(date_txt), после чего я смогу думаю передать их в следующую функцию – opiums Jul 16 '19 at 13:13
  • @opiums За пределами какой из четырёх, объявленных у Вас, функций Вы хотите иметь возможность использовать эти вызовы? Если речь о самом начале кода, добавьте третьей строкой var date_txt; – V-Mor Jul 16 '19 at 13:19
  • К сожалению это не выводит переменную за пределы функции, я проверял – opiums Jul 16 '19 at 13:45
  • @opiums Тогда сначала такой вопрос: оно у Вас вообще хоть в каком-то виде сейчас работает? Меня очень смущает объявление переменной с использованием этой же переменной здесь: var date_txt = date_txt.split(",");. И я всё ещё не пойму, о каких "пределах" идёт речь. Укажите номер строки в Вашем коде, из которой Вы хотите иметь доступ к этой переменной. – V-Mor Jul 16 '19 at 13:48
  • @opiums Я изучил Ваш код более детально. Я конечно не мастер в этом языке (который, кстати, следовало бы указать в метках), но, по-моему, здесь могут возникнуть проблемы не только с видимостью переменных. – V-Mor Jul 16 '19 at 13:56
  • Ну, я вроде отрефакторил, сверху по идее адекватно все должно работать, если изначально логика была правильной. – Shiki Jul 16 '19 at 14:02