• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

XMLHttpRequest, pobieranie danych z pliku blad

VPS Starter Arubacloud
0 głosów
402 wizyt
pytanie zadane 7 grudnia 2018 w JavaScript przez DragonCoder Nałogowiec (36,500 p.)

Witam,

pisze apke w QT i chcialem pobrac wspolrzedne  pliku. Dane te sa zapisane:

50.123334;51.123334
49.123334;51.123334
48.123334;51.123334
47.123334;51.123334
46.123334;51.123334
45.123334;51.123334
44.123334;51.123334

I chcialem je zaladowac i pozniej zaznaczyc na mapie. Napisalem wiec funckje do pobierania tych danych:

    function requestToTextFile (file_name, lat_value, long_value, line) { 
        var request = new XMLHttpRequest()
        request.open('GET', file_name)
        request.onreadystatechange = function(event) {
            if (request.readyState == XMLHttpRequest.DONE) {
                line = request.responseText.split('\n')
            }
        }
        request.send()

        for (var i = 0; i < line.length; i ++) {
            if (line[i] == ";") {
                var n = i;

                for (var k = 0; k < n; k ++) {
                    x += line [k];
                } //for
            }// if

            if (line[i] == "\n") {
                var m = i;

                for (var l = m; l !=  "\n"; l ++) {
                    y += line[l]
                } // for
            } // if
        }
        return [x, y];

    }

file_name = nazwa pliku, ktora funkcja dostaje od komponentu FileDialog

lat_value, long_value = to wspolrzedne geograficzne

 

Te dodatkowe petle maja odzielic os siebie wysokos i szerokosc geograficzna, bo sa zapisane w jednej linii, a potrzebuje ich osobno, zeby pozniej moc je przekazac do innego komponentu.

Moglby mi ktos powiedziec, gdzie lezy blad, bo sprawdzajac wartosci jakie dostaje to 0, a dane w pliku sa zapisane. Mysle, ze zle operuje danymi, ktore dostaje z pliku, ale nie jestem pewien

Pozdrawiam DC

1 odpowiedź

+1 głos
odpowiedź 8 grudnia 2018 przez adrian17 Ekspert (344,100 p.)
wybrane 8 grudnia 2018 przez DragonCoder
 
Najlepsza

To kwestia rozumienia asynchronicznego kodu.

line = request.responseText.split('\n'

Ta linia odpali się po otrzymaniu odpowiedzi na zapytanie...

for (var i = 0; i < line.length; i ++) {

Ale ta linia odpala się od razu po wykonaniu zapytania - a nie po otrzymaniu odpowiedzi. Stąd problem - po wykonaniu zapytania, nie masz jeszcze niczego ciekawego w zmiennej `line`.

Jako, że funkcja polega na asynchronicznym kodzie (zapytanie sieciowe), nie możesz z niej tak po prostu zwrócić wartości, musisz zastosować sposób odpalania kodu "później". Są to, w kolejności od najstarszego do najnowszego, przekazania callbacka, Promise, funkcje async/await (i fetch() zamiast XMLHttpRequest).

komentarz 8 grudnia 2018 przez DragonCoder Nałogowiec (36,500 p.)
Czyli jezeli dobrze rozumiem, to tworze 2 funkcje, 1 dla wyczytania danych z pliku, to funkcje przekazuje do funkcji call back i wartosci przetworzone z call back, przekazuje dopiero dalej?
komentarz 8 grudnia 2018 przez DragonCoder Nałogowiec (36,500 p.)
function requestToTextFile (file_name, line) {
    var request = new XMLHttpRequest()
    request.open('GET', file_name)
    request.onreadystatechange = function(event) {
        if (request.readyState == XMLHttpRequest.DONE) {
            line = request.responseText.split('\n')
        }
    }
    request.send()
}

function obroka_danych (x, y, line) {
    for (var i = 0; i < line.length; i ++) {
        if (line[i] == ";") {
            var n = i;

            for (var k = 0; k < n; k ++) {
                x += line [k];
            } //for
        }// if

        if (line[i] == "\n") {
            var m = i;

            for (var l = m; l !=  "\n"; l ++) {
                y += line[l]
            } // for
        } // if
    }
    return [x, y];
}

function process(callback) {
    if (typeof callback !== 'function') {
             callback = false;
        }

        if (callback) {
             callback();
        }
}

Tak by to wygladalo wtedy, tak ?

komentarz 8 grudnia 2018 przez adrian17 Ekspert (344,100 p.)

Um.., to process() nic konkretnego nie robi...

W wersji z callbackami, bardziej coś w stylu

 

function requestToTextFile(file_name, callback) {
    var request = new XMLHttpRequest()
    request.open('GET', file_name)
    request.onreadystatechange = function(event) {
        if (request.readyState == XMLHttpRequest.DONE) {
            line = request.responseText.split('\n')

            // for (var i = 0; i < line.length; i ++) {
            // ... etc
            // obrobka danych

            callback([x, y]);
        }
    }
    request.send()
}

requestToTextFile('file.txt', function(coordinates) {
    console.log(coordinates);
});

 

komentarz 8 grudnia 2018 przez DragonCoder Nałogowiec (36,500 p.)
Ale callback, to wtedy funkcja, ktora ma posortowac dane, tzn przypisac do zmiennych, a jako arguent musi przyjac tablice zmiennych, tak?
komentarz 8 grudnia 2018 przez adrian17 Ekspert (344,100 p.)

Nie wiem, o jakim sortowaniu mówisz. Dałem tu przykład callbacka:

requestToTextFile('file.txt', function(coordinates) {
    console.log(coordinates); // coordinates to [x, y]
});

 

Podobne pytania

0 głosów
1 odpowiedź 145 wizyt
0 głosów
1 odpowiedź 1,103 wizyt
0 głosów
0 odpowiedzi 359 wizyt
pytanie zadane 23 kwietnia 2017 w C i C++ przez pewien_programista Obywatel (1,070 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...