2017-08-15 5 views
0

私はプロジェクトに取り掛かっています。forループ内でsetTimeoutを使用すると、数秒後に一時停止してループを続ける

配列の項目(ユーザーの電子メール)はかなりあり、バッチごとに電子メールを送信したいと思います。

sendMail関数がループ内で呼び出されます。今は動作しますが、10回送信するたびに60秒間停止するように書き直したいと思います。

ここは私のコードです。

for (var i = 0; i < unsetUsers.length; i++) { 
    var user = unsetUsers[i]; 
    var obj = { 
    --- 
    }; 
    //send mail to each one of them 
    sendSetUpMail(obj); 
} 

これはfor loopsetTimeoutまたはsetInterval

+0

[ループの各繰り返しにポーズ/インターバルを追加](https://stackoverflow.com/questions/13913786/add-a-pause-interval-to-every-iteration-in-a)の可能な複製-for-loop) – melpomene

答えて

0

を使用してachivedすることができますはい、私の意見では、読みやすい方法でこれを行うための最善の方法は、再帰関数です。あなたのケースと同じ機能ですが、各バッチで60秒待っています。

sendEmailsBatched(unsetUsers, 0, 10)

ます。また、関数にタイムアウト(ミリ秒)を渡し、または10に常にbatchNumberをハードコーディングできます

function sendEmailsBatched(unsetUsers, offset, batchNumber) { 
    var users = unsetUsers.slice(offset, offset + batchNumber); 

    users.forEach(function(user) { 
    var obj = { 
     --- 
    }; 
    //send mail to each one of them 
    sendSetUpMail(obj); 
    }) 

    var newOffset = offset + batchNumber; 

    if (newOffset < unsetUsers.length) { 
    setTimeout(function() { 
     sendEmailsBatched(unsetUsers, newOffset, batchNumber); 
    }, 60 * 1000); 
    } 
} 

さて、あなたはこのような最初の時間は、この関数を呼び出すことができます。

+0

ありがとう@ignacio、私はそれを試してみるとあなたに戻ってきます – Kenshinman

関連する問題