2016-03-31 15 views
2

私は以下のようなテキストエリアを持っている:AJAX - フリーズブラウザなしで1つずつ非同期リクエストを行うにはどうすればいいですか?

<textarea name="mailist" id="mailist" placeholder="[email protected]"></textarea> 

は私がmailistからの要求を行い、「スプリット」と「foreachの」を使用して、いくつかのURLに(電子メール・パー・ライン)のデータを送信したいです。それは成功です。

しかし、問題は、送信ボタンをクリックすると、すべてのリクエストが同時に送信されたことです。私はそれを行うことができます方法:

  • が他の

  • の終了後に要求を送信し、要求を行い非同期

  • はブラウザ

+0

.. – Rayon

答えて

5

を凍結しないで何探しているのはpromiseです。 jQueryの$.ajax関数はすべてpromiseを返します。詳細はdocumentation hereをご覧ください。要点は、返された約束は、thenという関数を公開しています。これは、望むやり方で要求を次々に連鎖させるために使用できます。

それは非同期で動作するので、あなたがそう

request.then(
    function successHandler(response) { 
     /* The first function will be called if the request is successful */ 
    }, 
    function failureHandler(response) { 
     /* The second function will be called if the request fails */ 
    } 
); 
のように、要求が正常に完了し、あるいは失敗した場合、あなたが知っているようにハンドラを登録する必要があり、この種の

var request = $.ajax({ 
    method: 'get', 
    url: 'www.google.com' 
}); 

のAJAXリクエストを考えてみましょう

このパターンを使用すると、要求が成功するか失敗するかを待ってから次のパターンに進むことができます。

そのまま以前のコードセクションを残し

あなたはある種のキューを実装する必要があります。ほとんどのブラウザには、約2〜5件の同時リクエストの上限があります。例では、私はOPは彼が求めているの質問に基づいてこれを理解するつもりはないことを感じて

`.success`ハンドラを使用して

var emailAddresses = [/* a list email addresses */]; 
 
var MAX_SIMULTANEOUS_REQUESTS = 4; 
 
var CURRENT_REQUESTS = []; 
 

 
function runRequests(emailAddresses, max, running) { 
 
    while(running.length < max) { 
 
    running.push(createRequest(emailAddress.pop(), running)); 
 
    } 
 
    return emailAddresses.length; 
 
} 
 

 
function createRequest(emailAddress, running) { 
 
    var request = /* Creates requests in some manner */; 
 
    request 
 
    .then(
 
     function() { 
 
     /* Remove this request from the list of running requests */ 
 
     var indexOfRequest = running.indexOf(request); 
 
     running.splice(indexOfRequest, 1); 
 
     }, 
 
     function() { 
 
     /* For extra points, add this to a retry queue */ 
 
     } 
 
    ); 
 
    
 
    return request; 
 
} 
 

 
/* Usage */ 
 
var interval = setInterval(function() { 
 
    var remaining = runRequests(emailAddresses, MAX_SIMULTANEOUS_REQUESTS, CURRENT_REQUESTS); 
 
    if (remaining === 0) { 
 
    clearInterval(interval); 
 
    } 
 
}, 500);

+0

だろう。彼の問題は、複数の要求のボトルネックではありません。 – A1rPun

+0

@ A1rPunはい、送信ボタンをクリックすると1つずつ非同期リクエストを行いたいだけです。 –

+1

@ A1rPunあなたは有効なポイントを作成します。私はおそらく 'then'セクションについて説明するべきです –

関連する問題