2017-08-15 57 views
0

我正在开发一个项目,并且我想通过循环浏览服务器上的一组电子邮件给用户发送电子邮件。在forloop中使用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 loopsetTimeoutsetInterval

+0

[为FOR LOOP中的每个迭代添加一个暂停/间隔]可能的重复(https://stackoverflow.com/questions/13913786/add-a-pause-interval-to-every-iteration-in-a -for-loop) – melpomene

回答

0

是的,在我看来,以可读的方式做到这一点的最好办法是用递归函数achived。与您的情况相同的功能,但每个批次等待60秒。现在

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); 
    } 
} 

,你可以调用这个函数第一次是这样的:

sendEmailsBatched(unsetUsers, 0, 10)

您也可以通过超时毫秒的功能,或硬编码batchNumber总是10

+0

谢谢@ignacio,我会试试看,回复你 – Kenshinman