Czy ajax może zwracać wartość??

0

Chciałbym użyć ajax jako funkcji zwracającej.
Coś takiego:

var ajaxValue = ajaxReturn('file.txt');
console.log(ajaxValue);


function ajaxReturn(filePath) {
    $.ajax({
        type: "POST",
        url: "../php_scripts/readFile.php",
        data: {klucz_ajax: filePath},
        success: function (data) {
            
             return  JSON.parse(data); //  coś w tym stylu
             
        },
    });
//  return ???????
}

Czy jest to możliwe i jak powinienem się do tego zabrać?

0

ajax wykonuje się asynchronicznie więc nie.

1

Tak, ajax można wywoływać synchronicznie. W jQuery to będzie np.

function getSyncData() {
    return $.ajax({
        type: "GET",
        url: http://<adres>,
        async: false
    }).responseText;
}
2
function fetchCośTam() {
  return $.ajax({});
}

fetchCośTam().then(function(data) {
  console.log(data);
});

Ajax zwraca promise.
@TomDom tak, jak wyżej nie rób.

0

Już napisałem coś takiego i działa !!!

function innafunkcja() {
    var trescPliku  = JSON.parse(readTxtFile('upload/t.txt'));
    console.log("trescPliku:  " + trescPliku);
}
function readTxtFile(filePath) {
    return $.ajax({
        type: "POST",
        url: "../php_scripts/readFile.php",
        async: false,
        data: {klucz_ajax: filePath},
    }).responseText;
}

zaraz jeszcze mala przerobka...

0

Finalnie bedzie coś takiego:

function innafunkcja() {
    var trescPliku  = readTxtFile('upload/t.txt');
    console.log("trescPliku:  " + trescPliku);
}
function readTxtFile(filePath) {
    var ret = $.ajax({
        type: "POST",
        url: "../php_scripts/readFile.php",
        async: false,
        data: {klucz_ajax: filePath},
    }).responseText;
    //  tu dojda
    // jakies instrukcje i przerobki ( musze usunac znaczniki nowej linii...
    return JSON.parse(ret);
}

Ajax zwraca promise.
@TomDom tak, jak wyżej nie rób.

Hmm nie wiem co mam zrobić
zależy mi na funkcji do będzie mi zawracać tablicę z liniami pliku tekstowego i takie rozwązanie działa. Gdy próbowałem użyć działań asychronicznych to mogłem jedynie wpisać wynik do zmiennej globalnej w której te dane pojawiały się z pewnym opoznieniem.
Rozwiązanie takie jak powyżej działa odpowiednio do moich potrzeb;

1

Async false powoduje, że zamulasz przeglądarkę do momentu aż nie dostaniesz odpowiedzi. Jak to potrwa 30 sec, to nikt na Twojej stronie nic nie zrobi.. Zlituj sie. To żądanie (AJAX) nazywa się asynchroniczne z jakiegoś powodu.

Z resztą sam się możesz przekonać. Dodaj do swojego skryptu PHP sleep(60) i sprawdź co się stanie.

http://jsdn.pl/asynchronicznosc-javascript-dla-poczatkujacych/

0

Rozumiem co macie na myśli i macie racje. Tylko, że ja chce z tego pliku robić raz na jakiś czas update informacji w bazie danych i będzie to trwało kilka sekund raz na kilka tygodni poza tym system który piszę bedzie wykorzystywany do wewnętrznych zastosowań.

Dobrze zrozumiałem żeby nie wykorzystywać takiego rozwiązania żeby nie przycinać strony asynchroniczne działania to coś jak wielowątkowość w innych językach.

0

Jaki widzisz problem z normalnym callbackiem? Każdy tego używa i jakoś nikt nie narzeka, a jest to jedyne właściwe rozwiązanie.

0
mr_jaro napisał(a):

ajax wykonuje się asynchronicznie więc nie.

Jedyny problem z callbackiem jaki mam to to że jeszcze nie wiem co to jest. Poprosiłem o pomoc na forum i otrzymalem info ze można wyłaczyć działania asynchroniczne i funkcja zaczeła zwracać oczekiwany wynik :)
Gdyby ktoś mi odpowiedział, że do tego powinno się używać callbacku to by mnie naprowadziło znacznie lepiej niż suche info że się nie da....

1

to co użyłeś w swoim poście podpięte do success to jest callback, funkcja wywoływana gdy dostaniesz już odpowiedź z serwera, tak samo możesz podpiąć funkcje error. Ewentualnie możesz zrobić tak jak podał Desu ale to jest to samo, do then przekazujesz callbacka.

1

@TomDom

Masz tu krótki przykład dlaczego async: false to kiepski pomysł - zasymulowany blokujący i nieblokujący request, poodpalaj sobie pojedynczo przykłady i spróbuj poklikać w button ;)

-> https://codepen.io/caderek/pen/WZYRPw?editors=0011

A co do rozwiąznia - @Desu już podał bardzo dobre, w zastosowaniu do Twojego kodu:

function innafunkcja() {
  return readTxtFile('upload/t.txt')
    .then(response => {
       // zrób co chcesz z response
    })
}

function readTxtFile(filePath) {
  return $.ajax({
    type: "POST",
    url: "../php_scripts/readFile.php",
    data: {klucz_ajax: filePath},
  })
}
1

poczytaj sobie o obietnicach, tj. o promisach ( https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch3.md <- tu jest o natywnych promisach, chociaż nie wiem czy jQuery używa natywnych czy nie. Chociaż nie, o nienatywnych też tam jest z tego co widzę ). Promisy to taka abstrakcja oznaczająca wartość, która będzie w przyszłości. Tak samo jeśli kupujesz bilet do kina (tj. wywołujesz metodę kupBilet()), to bilet jest taką twoją obietnicą (promise), która dopiero może się zamienić w film, jak wejdziesz do sali kinowej i go obejrzysz. Coś jak

kupBilet().then(function (film) {
   film.ogladaj();
});

innymi słowy asynchroniczna funkcja może zwrócić wartość, tylko będzie to wartość specjalna (obietnica wartości, która dopiero się zamieni w wartość).

1 użytkowników online, w tym zalogowanych: 0, gości: 1