2012-11-18 23 views
5

Powiel możliwe:
passing index from for loop to ajax callback function (javascript)Jak radzić sobie z Simultaneous javascript xmlhttpdquests?

I byli trochę mylić z podejmowania XMLHttpRequests, na różnych serwerach, aby przynieść pewne treści .. tutaj jest to, co już napisano, ale wydaje mi się, że w pewnym momencie się pomyliłem ...

var URL = new Array(); 
URL[0] = "http://www.example1.com"; 
URL[1] = "http://www.example2.com"; 
URL[2] = "http://www.example3.com"; 
var nRequest = new Array(); 
for (var i=0; i<3; i++){ 
nRequest[i] = new XMLHttpRequest(); 
nRequest[i].open("GET", URL[i], true); 
nRequest[i].onreadystatechange = function (oEvent) { 
if (nRequest[i].readyState === 4) { 
if (nRequest[i].status === 200) { 
    console.log(nRequest[i].responseText); 
    alert(nRequest[i].responseText); 
} else { 
    console.log("Error", nRequest[i].statusText); 
} 
    } 
}; 
nRequest[i].send(null); 
} 

z tym kodem na IE10 otrzymuję dostęp Odmowa na konsoli ..

Jeśli usunąć tablicę i użyć prostego wniosku, że działa zgodnie z oczekiwaniami ..

wRequest = new XMLHttpRequest(); 
wRequest.open("GET", "http://www.example1.com", true); 
wRequest.onreadystatechange = function (oEvent) { 
if (wRequest.readyState === 4) { 
if (wRequest.status === 200) { 
    console.log(wRequest.responseText); 
    alert(wRequest.responseText); 
} else { 
    console.log("Error", wRequest.statusText); 
} 
    } 
}; 
wRequest.send(null); 
} 

ale jak IMI powinien wywołać wiele 2-3 wnioski i nadal nie ma problemu z danymi obsługa..??

+3

Nie możesz używać AJAX do odczytu danych z innej domeny. – SLaks

+0

Widzę literówkę 'wURL' ->" URL ", problem zamknięcia" i "wewnątrz anonimowej funkcji i ten sam problem dotyczący pochodzenia. – Musa

+0

Dlaczego otrzymuję dane tylko z jednej domeny? – nikolas

Odpowiedz

11

Problem (z pominięciem problemu z wieloma domenami objętymi przez program slebetman) polega na tym, że po uruchomieniu wywołania zmiany stanu gotowego stanu używana jest zmienna i z zakresu zawierającego, który będzie 3 po zakończeniu pętli. Jednym ze sposobów, aby naprawić to w następujący sposób:

for (var i=0; i<3; i++){ 
    (function(i) { 
     nRequest[i] = new XMLHttpRequest(); 
     nRequest[i].open("GET", URL[i], true); 
     nRequest[i].onreadystatechange = function (oEvent) { 
     if (nRequest[i].readyState === 4) { 
      if (nRequest[i].status === 200) { 
       console.log(nRequest[i].responseText); 
       alert(nRequest[i].responseText); 
      } else { 
       console.log("Error", nRequest[i].statusText); 
      } 
     } 
     }; 
     nRequest[i].send(null); 
    })(i); 
} 

Wprowadza to natychmiast powołać wyrażenie funkcyjne dla każdej pętli iteracja takie, że kod wewnątrz funkcji posiada własny i - magia zamknięć JS oznacza, że ​​gdy funkcja onreadystatechange nazywa się, że uzyska dostęp do parametru i anonimowej funkcji (nawet jeśli ta funkcja została zakończona), a nie do i zewnętrznego zakresu, więc odpowiedni element nRequest będzie przetwarzany za każdym razem.

Również miałeś literówkę na linii .open(), gdzie powiedziałeś wURL[i], ale powinieneś był mieć URL[i].

W zależności od tego, co planujesz zrobić z tekstem odpowiedzi, nie jestem pewien, czy potrzebujesz w ogóle tablicy żądań: możesz uwzględnić kod Ajax w funkcji, która przyjmuje adres URL i funkcję zwrotną jako parametry, a następnie wywołaj tę funkcję w pętli ...

+1

, która załatwiła sprawę .. !!! ostatnio miałem problem z inną sprawą z zakresem js i wydaje mi się, że znów stawiam czoła temu ... dziękuję bardzo .. !!! – nikolas

+0

Nie ma za co. Pokazałem jedynie minimalną zmianę w istniejącym kodzie, aby działało, ale są (moim zdaniem) lepsze sposoby na uporządkowanie całości - prawdopodobnie poza zakresem tego pytania. – nnnnnn

+0

to literówka, po prostu próbowałem kodu, aby wyglądać przyjaźnie, niż moja oryginalna obsługa nazw zmiennych ... jak w przypadku mojego komentarza, próbuję tylko stworzyć aplikację mashup, która zbiera dane z 2-3 różnych stron i zbiera jakieś konkretne informacje od każdego .. to dlaczego myślałem, że byłoby lepiej użyć tablicy .. – nikolas

0

dokonywania XMLHttpRequests, aby różne serwery

Nie można tego zrobić. XMLHttpRequest może łączyć się tylko z tą samą domeną, do której należy strona. To się nazywa "polityka tego samego pochodzenia".

Google "zasady tego samego pochodzenia" lub wyszukaj go tutaj, aby uzyskać więcej informacji.

+0

dziękuję za odpowiedź, jednak z jakiegoś powodu, otrzymuję odpowiedź, kiedy wyzwalam pojedynczą prośbę .. – nikolas

Powiązane problemy