带有回调的AJAX请求中的jQuery Break循环

时间:2016-08-19 14:15:51

标签: javascript jquery ajax search callback

我对我的脚本有点困惑:我正试图通过jQuery和AJAX在我的页面中搜索。在这个例子中,我想在2个站点中搜索关键字,我想在找到的东西时打破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);
            }
        }
    });
};

2 个答案:

答案 0 :(得分:1)

jQuery documentation州:

  

我们可以在特定的迭代中打破$.each()循环   回调函数return false。返回non-false与a相同   在for循环中继续声明;它将立即跳到下一个   迭代。

答案 1 :(得分: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());
        }
    }));
});