2016-08-19 15 views
0

私のスクリプトではちょっと固まっています。私はjQueryとAJAXを使って自分のページを検索しています。この例では、私はキーワードの2つのサイトで検索すると、私は、私が何かを発見したとき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()); 
     } 
    })); 
}); 
関連する問題