JavaScript z AJAX w innej funkcji
Z tego przykładu, zamiast umieścić pierwsze 19 punktów z losowymi wartościami, chcę przejść wartość z mojego serwera przez AJAX.
I mówię o kodzie tutaj.
series: [{
name: 'Random data',
data: (function () {
var data = [],
time = (new Date()).getTime(),
i;
for (i = -19; i <= 0; i += 1) {
data.push({
x: time + i * 1000,
y: Math.random()
});
}
return data;
}())
}]
A ponieważ klucz series
jest również data
Nie mam pojęcia, jak będę dostać data
z AJAX
GET
połączenie.
AJAX
zadzwoń, że chcę użyć:
$.ajax({
type: "GET",
url: "/getData",
success: function(data) {
var y1 = data.count;
series.addPoint([x, y1], true, true);
}
});
Ale starałem się z tego używać, ale wydaje się, że nie działa, podobnie jak:
series: [{
name: 'Random data',
data: (function () {
var data1 = [],
time = (new Date()).getTime(),
i;
$.ajax({
type: "GET",
url: "/getData",
success: function(data) {
var y1 = data.count;
for (i = -19; i <= 0; i += 1) {
data1.push({
x: time + i * 1000,
y: data.count
});
}
}
});
return data1;
}())
}]
Daj mi znać, jak GET
dla highchart {x1}}
2 odpowiedzi
Po pierwsze Zobacz to odniesienie, dlaczego nie można zwrócić danych z funkcji zewnętrznej, jakbyś próbował:
Jak zwrócić odpowiedź z wywołania asynchronicznego?
Następnie, zrozumienie, że będziesz musiał użyć danych z obsługi success
, oznacza to, że będziesz musiał przenieść połączenie AJAX poza deklaracją danych i zrób to potem, ale będziesz musiał rozpoznać, że dane nie będzie dostępny do chwilowego później, gdy wykończenia AJAX Call. Nie możesz go natychmiast użyć. Jeśli chcesz wiedzieć, kiedy dane są dostępne, a następnie umieść dane do struktury danych i zadzwoń do innej funkcji z obsługi sukcesu.
Jak powiedziano im, że połączenie Ajax jest async = nie blokowanie, oznacza to, że przeglądarka wykonuje połączenie AJAX w swojej funkcji i natychmiast trafia na następny wiersz w swoim przypadku {x1}}, ale data1
} nie jest aktualizowany, ponieważ połączenie AJAX jest nadal wykonywane.
Dokumentacja: http://api.jquery.com/deferred.done/
Istnieją również rzeczy, których nie rozumiem w swoim kodzie, czy próbowałeś uciszyć uderzeniem JStint lub JSlint?, Oto moja wersja z pewnymi poprawkami:
// define var outside of function so they are not scoped
var time = (new Date()).getTime(),
data1,series;
$.ajax({
type: "GET",
url: "/getData",
success: function(data) {
// since you are using i only here just define it in the cycle
for (var i = -19; i <= 0; i += 1) {
data1.push({
x: time + i * 1000,
y: data.count
});
}
}
}).done(function() {
series = {
name: 'Random data',
data: data1
};
});