Przeczytałem już ten artykuł Jak zwrócić Odpowiedź z asynchronicznego połączenia? jednak nie mogłem wymyślić rozwiązania. Robię prośbę Ajax

function getdata(url) 
 {
 console.log('Started');
 jQuery.ajax({
 type: "GET",
 url: "http://myserver.com/myscript.php",
 dataType: "json",
 error: function (xhr) {
    console.log('Error',xhr.status);
        },
 success: function (response) {
   console.log('Success',response);

         }
    });
 }

A konsola wyświetla wszystko dobrze, ale kiedy mówię

var chinese = getdata();

Uzyskać dane. Dostaję:

Niepudonowany TypeError: Nie można odczytać właściwości "Długość" niezdefiniowanego błędu dla tej linii

var text = chinese[Math.floor(Math.random()*chinese.length)];

Czy ktoś może mi tu pomóc?

0
digitalsuite.net 27 czerwiec 2017, 10:51

4 odpowiedzi

Najlepsza odpowiedź

Problem polega na tym, że używasz metody asynchronicznej oczekującej wyniku synchronicznego.

Dlatego należy użyć kodu w wyniku połączenia asynchronicznego jak następujące:

function getdata(url) {
  console.log('Started');
  jQuery.ajax({
    type: 'GET',
    url: url,
    dataType: 'json',
    error: function(xhr) {
      console.log('Error', xhr.status);
    },
    success: function(chinese) {
      var text = chinese[Math.floor(Math.random()*chinese.length)];
      // Do something else with text
    }
  });
}

getData('http://myserver.com/myscript.php');

Mam nadzieję, że to pomoże :)

1
ajimix 27 czerwiec 2017, 08:01

Możesz spróbować użyć połączeń zwrotnych lub możesz spojrzeć na obietnice.

Pomysł z wywołaniami zwrotnymi jest, aby przekazuje funkcję, która jest uruchamiana po zakończeniu żądania AJAX. Że wywołanie zwrotne może zaakceptować parametr, w tym przypadku odpowiedź.

. Korzystanie z połączeń zwrotnych:

function getData(url, successCallback, errorCallback) {
  console.log('Started');

  jQuery.ajax({
    type: "GET",
    url: url,
    dataType: "json",
    error: function(xhr) {
      errorCallback(xhr.status);
    },
    success: function(response) {
      successCallback(response);
    }
  });
}

var chinese;

getData("http://myserver.com/myscript.php", function(response) {
  chinese = response; // you can assign the response to the variable here.
}, function(statusCode) {
  console.error(statusCode);
});

Korzystanie z obietnic (

function getData(url) {
  return new Promise(function(resolve, reject) {
    console.log('Started');
    
    jQuery.ajax({
      type: "GET",
      url: url,
      dataType: "json",
      error: function(xhr) {
        reject(xhr.status);
      },
      success: function(response) {
        resolve(response);
      }
    });
  });
}

var chinese;

getData("http://myserver.com/myscript.php").then(function(response) {
  chinese = response;
  console.log(chinese);
}, function(statusCode) {
  console.error(statusCode);
});
0
Corsin 27 czerwiec 2017, 08:18

Problemem jest funkcja GetData niczego nie zwraca. W funkcji GetData wykonujesz żądanie AJAX, która jest asynchroniczną. Dane, o które żądane, nie mogą i nie można ich zwrócić z funkcją GetData.

Ale będziesz miał żądane dane w funkcji sukcesu:

function getdata(url) 
 {
 console.log('Started');
 jQuery.ajax({
 type: "GET",
 url: "http://myserver.com/myscript.php",
 dataType: "json",
 error: function (xhr) {
    console.log('Error',xhr.status);
        },
 success: function (response) {
   console.log('Success',response);
var text = response[Math.floor(Math.random()*response.length)];
         }
    });
 }

Ponieważ nie jestem w stanie przetestować swojego kodu, możesz debugować odpoczynek na własną rękę. Ale zmienna odpowiedzi będzie najprawdopodobniej zmienna "chińska".

0
Daniel Z. 27 czerwiec 2017, 08:00

Błąd, który otrzymasz, jest z asynchronicznego charakteru połączenia. Proponuję, abyś przypisać wartość po uzyskaniu reakcji sukcesu z API jak poniżej.

var chinese = getdata();

Następnie funkcja getdata() będzie jak

function getdata(url) 
 {
 console.log('Started');
 jQuery.ajax({
 type: "GET",
 url: "http://myserver.com/myscript.php",
 dataType: "json",
 error: function (xhr) {
    console.log('Error',xhr.status);
        },
 success: function (response) {
     initChinese(response.data);

         }
    });
 }

I utwórz funkcję initChinese() jak

var text;
function initChinese(chinese){
 text = chinese[Math.floor(Math.random()*chinese.length)];
}

Można również zadeklarować zmienną text w globalnym zakresie, a następnie przypisać wartość do text w funkcji success bez konieczności tworzenia nowej funkcji initChinese.

0
Ankit Agarwal 27 czerwiec 2017, 07:59