もっと一般的なチャンク方法を選びます。
Array.implement({
chunkEach: function(offset, count, delay, fn, bind){
// get a chunk
var newOffset = offset + count,
chunk = this.slice(offset, newOffset),
ii = 0,
len = chunk.length;
if (!len)
return this;
// loop the chunk supporting natural index.
for (; ii< len; ++ii)
fn.call(bind, chunk[ii], offset + ii);
// move pointer and self call
if (newOffset < this.length)
this.chunkEach.delay(delay, this, [newOffset, count, delay, fn, bind]);
// pointless chaining return as its async.
return this;
}
});
たとえば、2秒間休止して15のチャンクで電子メールアドレスのループ配列を使用し、関数のスコープをオプションプロパティを持つ架空のオブジェクトに保持します。
list.chunkEach(0, 15, 2000, function(el, index){
console.log(this.options);
new Element('div[html='+index + '. ' + el +']').inject(o);
}, this);
http://jsfiddle.net/dimitar/aYwab/を参照してください
その大まかな-引数などのチェックが欠けていますが、それはあなたが望むことをします。
ここで遅延を解決する責任について疑問があるかもしれません。おそらくajax経由でメールを送信しています。あいまいな遅延はスケーラブルではありません。
関数をチェーン可能にすることを検討する必要がありますsendEmail
-配列とインデックスをその中に渡すだけです。インデックスが配列の長さ-1未満の場合は、次のインデックスを使用してsendEmail
から再度呼び出します。onSuccess
これにより、最後の送信が失敗した場合に中断または再試行することもできます。
また、Promisesを使用することもできます。