2016-08-19 2 views
0

제 스크립트에 조금 얽혀 있습니다. jQuery와 AJAX를 통해 내 페이지를 통해 검색을 시도하고 있습니다. 이 예에서 나는 키워드에 대한이 개 사이트에서 검색 할 내가 뭔가를 발견 할 때 나는 AJAX 루프를 중단 할 :jQuery AJAX의 중단 루프 콜백 요청

var urls = [ 
    'http://docs.db-dzine.com/woocommerce-advanced-categories/', 
    'http://docs.db-dzine.com/woocommerce-catalog-mode/', 
]; 
var found = false; 
$.each(urls, function(i, url) { 
    ajaxSearchPage(url, keyword, function(found) { 
     console.log(found); 
     if(found) { 
      return true; 
     } 
    }); 
    if(found) { 
     return true; 
    } 
}); 

내가 여기에 루프를 중단하는 방법을 모르겠어요 ... 도와주세요 .

그리고 내 AJAX 기능 :

var ajaxSearchPage = function(url, keyword, callback) { 
    $.ajax({ 
     url: url, 
     type: "GET", 
     dataType: "html", 
     success: function(response) { 

      // Do not load images 
      var page = response.replace(/<img/gi, '<noload'); 
      // Create parsable body for jQuery 
      var body = $('<div id="body-mock">' + page.replace(/^[\s\S]*<body.*?>|<\/body>[\s\S]*$/ig, '') + '</div>'); 

      // Find the keyword in content 
      var content = body.find('#content:containsNC("'+ keyword +'")'); 
      if(content.length > 0) { 
       searchResultsWrapper.show(); 
       callback(true); 
      } else { 
       callback(false); 
      } 
     } 
    }); 
}; 
+0

그냥 'break;'를 사용하십시오. 다음은 멋진 기사입니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/break 및 http://stackoverflow.com/questions/183161/best-way-to- 네스트 루프에서 중첩 된 루프 – Pugazh

+2

'$ .each' 루프를 해제하려면 루프 콜백에서'false'를 반환해야합니다. –

+0

나는 오늘 [비슷한 질문] (http://stackoverflow.com/a/39037589/1267304)에 오늘 답했다. 내가 그랬던 것처럼 할 수 있고, 언제든지 * 루프 *를 끝낼 수 있습니다. – DontVoteMeDown

답변

0

jQuery documentation 상태 :

우리는 콜백 함수 return false함으로써 특정 반복에서 $.each() 루프를 중단 할 수 있습니다. non-false을 반환하면 for 루프의 continue 문과 과 동일합니다. 즉시 다음 반복으로 건너 뜁니다.

0

AJAX 호출은 지연된 작업이므로 전체 루프가 실행될 수 있습니다. 이는 모든 네트워크 요청이 완료되는시기를 알 수 없기 때문입니다. jQuery.ajax을 보면 jqXHR 개체를 반환합니다. jqXHR은 abort 메서드를 사용하여 네트워크 요청을 취소합니다.

그래서 우리가 실제로 원하는 것은 우리가 원하는 결과를 얻으면 모든 요청을 취소하는 것입니다. 이를 위해서는 요청을 대기열에 넣고 취소해야합니다.

var ajaxQueue = []; 
$.each(urls, function(i, url) { 
    ajaxQueue.push(ajaxSearchPage(url, keyword, function(found) { 
     if(found) { 
      ajaxQueue.forEach(jqXHR=>jqXHR.abort()); 
     } 
    })); 
});