jQuery AJAX 루프 호출
저는 AJAX를 사용하는 것이 처음이고, 페이지에 있는 많은 링크를 처리하고 각 링크에 대해 AJAX를 호출하는 사용자 스크립트를 작성하고 있습니다.
for (var i = 0; i < linkList.length; i++)
{
$.ajax({
url: linkList[i].getAttribute("href"),
cache: false
}).done(function( html )
{
var hasAppended = false;
if (html.indexOf('someStringOnGottenPage') != -1 && !hasAppended)
{
hasAppended = true;
var id = linkList[i].getAttribute("href").substring(linkList[i].getAttribute("href").indexOf('='));
$( "#links a[href*='" + id + "']" ).append(' THIS PAGE CONTAINS SPECIFIED DATA');
}
});
}
간단히 말하면, 저는 링크 목록이 있는 페이지를 가지고 있습니다.저는 링크를 통해 반복하고 AJAX가 각 링크 페이지의 내용을 처리하도록 하고, 해당 페이지에 지정된 내용이 포함되어 있으면 다시 보고하기를 원합니다.
제가 안고 있는 문제는 linkList를 통해 반복하는 데 사용되는 [i]의 값이 항상 6이며 절대 그러면 안 된다는 것입니다..done이 마지막으로 트리거할 때 AJAX가 처음 트리거한 값의 [i] 값을 알고 나중에 .done이 트리거할 때의 [i] 값을 알 수 있도록 데이터를 전달해야 합니다.
AJAX를 처음 호출할 때 .done이 [i] 값이라는 것을 어떻게 알 수 있습니까?
가장 쉬운 방법은 클로저를 사용하는 것입니다.루프에 비동기적인 것이 있을 때마다 같은 것입니다.
for (var i .....) {
asynchronousFunction(function() {
use(i);
}
}
이 유사 코드 스니펫에서 내부 함수는 다음에 의해 참조된 저장 위치를 캡처합니다.i
루프가 실행되고,i
최종 값으로 증가한 다음 비동기 콜백이 호출되기 시작하고, 모두 동일한 위치(값이 아님)를 검색합니다.
일반적인 솔루션은 다음과 같습니다.
for (var i .....) {
(function (i) {
asynchronousFunction(function() {
use(i);
});
})(i);
}
즉, 루프의 전체 내용을 자동 압축 기능으로 감쌉니다.
여기서, 외부의 값은i
래핑 자체 검색 익명 함수로 전달됩니다. 이 고유한 값의 위치는 비동기 콜백에 의해 캡처됩니다.이러한 방식으로 각 비동기는 자체 실행 기능이 호출되는 순간에 결정되는 자체 값을 얻습니다.
질문의 댓글 섹션에 있는 링크를 통해 코드에 어떤 문제가 있는지 알 수 있습니다.하지만 거기서 설명한 것보다 더 나은 해결책을 찾을 수 있습니다.
전달된 콜백이 각 반복에 대해 별도의 폐쇄를 생성할 수 있도록 목록을 통해 반복하려면 $.each()를 사용하십시오.
$.each(linkList, function (i, item) {
$.ajax({
url: item.getAttribute("href"),
cache: false
}).done(function (html) {
var hasAppended = false;
if (html.indexOf('someStringOnGottenPage') != -1 && !hasAppended) {
hasAppended = true;
var id = item.getAttribute("href").substring(item.getAttribute("href").indexOf('='));
$("#links a[href*='" + id + "']").append(' THIS PAGE CONTAINS SPECIFIED DATA');
}
});
})
jQuery 개체인 경우 .each()를 사용합니다.
linkList.each(function (i, item) {
var $item = $(item),
href = $item.attr("href");
$.ajax({
url: href,
cache: false
}).done(function (html) {
var hasAppended = false;
if (html.indexOf('someStringOnGottenPage') != -1 && !hasAppended) {
hasAppended = true;
var id = href.substring(href.indexOf('='));
$("#links a[href*='" + id + "']").append(' THIS PAGE CONTAINS SPECIFIED DATA');
}
});
})
언급URL : https://stackoverflow.com/questions/21819905/jquery-ajax-calls-in-for-loop
'programing' 카테고리의 다른 글
크롬의 jquery ajax 문제 (0) | 2023.07.25 |
---|---|
기기를 흔들었을 때 앱을 새로 고치는 방법은? (0) | 2023.07.25 |
Mongodb 콘텐트 및 문자열 (0) | 2023.07.20 |
numpy는 어떻게 사용하나요?어디서?제가 합격해야 하는 것은 무엇이고, 그 결과는 무엇을 의미합니까? (0) | 2023.07.20 |
for 루프에서 생성된 판다 데이터 프레임 추가 (0) | 2023.07.20 |