Zwracanie wyników poza funkcję Ajax

0

    function JakasFunkcja()
    {
        $.ajax
        ({
            type : 'get',
            url  : 'Zwroc.php',
            success:function(data) 
            {
                Handle(data);
            }
        });
    }

    function Handle(data)
    {
        console.log("wynik 1 " + data);
    }

Zwroc.php zwraca mi prostą liczbę, np. 5, czy jest jakiś sposób żeby wynik (data) przekazać do jakiejś zmiennej globalnej żebym mógł jej używać poza tymi funkcjami?

0
let something = 0;

function handle(data) {
  something = data;
}
0
Patryk27 napisał(a):
let something = 0;

function handle(data) {
  something = data;
}

Coś nie tak, jeżeli daje poza tymi funkcjami console.log("wynik 1 " + something); to wyświetla mi "0"

0

Jeśli dasz:

function handle(data) {
  something = data;
  console.log(something);
}

to zadziała.

Robisz prawdopodobnie tak:

$.ajax({
  /* ... */
}).done((msg) => {
  something = msg;
});

console.log(something);

co już nie zadziała, ponieważ $.ajax jest uruchamiane asynchronicznie (leci sobie w tle i dopiero w pewnym momencie kiedyś wykona się done(), a nie od razu).

0

czy jest jakiś sposób żeby wynik (data) przekazać do jakiejś zmiennej globalnej żebym mógł jej używać poza tymi funkcjami

Głupi pomysł, nie rób tak. Użyj promisów.

0
Maciej Cąderek napisał(a):

czy jest jakiś sposób żeby wynik (data) przekazać do jakiejś zmiennej globalnej żebym mógł jej używać poza tymi funkcjami

Głupi pomysł, nie rób tak. Użyj promisów.

Próbowałem, ale nie umiem sobie do końca z tym poradzić. Dostaję [object Promise] i żeby go użyć znowu muszę to robić w funkcji "x.then(function (data) {...." a chciałbym dostać wynik na "zewnątrz" żeby móc go wykorzystać w innych ajaxowych funkcjach żeby znowu nie pisać tego samego. Ogólnie działa mi wszystko, tylko chciałem uszczuplić kod.

1

(Nie)stety, jedno wykonanie asynchroniczne powoduje, że wszystko wyżej też musi być asynchroniczne.
Czytelność zwiększa nieco składnia async / await z ES7:

async getSomething() {
  return new Promise((resolve) => {
    $.ajax({
      /* ... */
    }).done((msg) => resolve(msg));
  });
}

async doSomethingWithSomething() {
  let something = await getSomething(); // ekwiwalent getSomething().then(...), tylko bez jawnego wrapowania wszystkiego w funkcję
  return something * 2; // ekwiwalent new Promise((resolve) => /* ... */);
}

Natomiast pod spodem nadal jest to zwyczajny Promise.

2

@Patryk27:

Coś się zaplątałeś w tych promisach, wystarczy:

function getSomething() {
  return $.ajax({/* props */})
}

async function doSomethingWithSomething() {
  const something = await getSomething()
  
  // do something with value, for example:
  console.log(something)
}
0

Maciej, dzięki, działa aż miło, właśnie o to mi chodziło :), świetne!

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