• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
625 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 Mentor (351,140 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 Mentor (351,140 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 Mentor (351,140 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ź 217 wizyt
0 głosów
1 odpowiedź 1,394 wizyt
0 głosów
0 odpowiedzi 495 wizyt
pytanie zadane 23 kwietnia 2017 w C i C++ przez pewien_programista Obywatel (1,070 p.)

93,191 zapytań

142,206 odpowiedzi

322,040 komentarzy

62,518 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2738p. - CC PL
  5. 2704p. - Tomasz Bielak
  6. 2678p. - Łukasz Siedlecki
  7. 2666p. - rucin93
  8. 2485p. - Marcin Putra
  9. 2475p. - Adrian Wieprzkowicz
  10. 2426p. - Mikbac
  11. 2418p. - Michal Drewniak
  12. 2239p. - Michał Telesz
  13. 2156p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1650p. - Mariusz Fornal
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...