2016-11-27 7 views
0

ボタン1が複数の非同期機能を管理

<button>button 1</button> 
 
<button>button 2</button> 
 
<button>button 3</button> 
 
<button>button 4</button>

のは、私は、ページ上に複数のボタンがあるとしましょう。クリックすると、赤色に変わります。この変換にはしばらく時間がかかります(5〜30秒)。

ボタンをクリックしたときに変換を開始するAjax呼び出しを実装しました。完了したらボタンを赤に変えます。サーバーが応答した後でなければ、ボタンは赤色に変わります。

私は一度に1つの変換だけを処理するためのメカニズムを実装しようとしています。つまり、ユーザーが複数のボタンをクリックすると、指定された時間に処理されているAjax呼び出しは1つだけです。

ユーザーがボタンをクリックしてそれぞれを再帰的に実行するときに、配列のajax呼び出しをプッシュするキューメカニズムを実装することを考えていました。しかし、私は動的にそれを行う方法、つまり、私の機能にどのように伝えるのか分かりません。「ユーザーが待ち行列に新しい項目を追加しました」と進んでください。

私はajax呼び出しの配列とajax呼び出しを一度に1回実行する関数を接続する必要があります。私の関数は、配列内で発生しているイベントをリッスンする必要があります。

他のアイデアはありますか?

ありがとうございます!

+0

あなたが唯一のAJAX呼び出しが一度に処理されると言う は、それが唯一のリクエストが送信されます意味ですか? – nem035

+0

Ajaxは常にaysncですが、前のリクエストを中止して他のリクエストを開始することができます。参考までに、http://stackoverflow.com/questions/19244341/abort-previous-ajax-request-on-new-requestをご覧ください。 – Sumit

+0

@ nem035リクエストは一度に送信されます。たとえば、ユーザーがbutton1とbutton2をクリックした場合、私の魔法の関数はbutton2のajax呼び出しを処理する前に、button1の答えを待つ必要があります。 –

答えて

0

この1確認してください:ユーザが複数のボタンをクリックした場合

は注意を。関数は最初の関数を実行します。別のイベントを配列(キュー)に入れます。 最初のイベントが完了したときは次のイベントをキューから実行します

var btns = Array.from(document.getElementsByTagName('button')), 
 
    isProcessing = false, queue = []; 
 

 
function proceed(e){ 
 
    if(isProcessing) { 
 
     queue.push(e.target); 
 
     return; 
 
    } 
 
    //start proccesing 
 
    isProcessing = true; 
 
    var ajax = setTimeout(()=> { 
 
    e.target.classList.add('done'); 
 
    isProcessing = false; 
 
    //processing the queue 
 
    if(queue.length) { 
 
     queue.shift().click(); 
 
    } 
 
    },4000); 
 
} 
 

 
btns.forEach(function(btn){ 
 
    btn.addEventListener('click', proceed); 
 
})
button.done { 
 
    color:red; 
 
}
<button>button 1</button> 
 
<button>button 2</button> 
 
<button>button 3</button> 
 
<button>button 4</button>