在 Javascript 中创建循环以与 imap-simple nodejs 包一起使用

Create loop in Javascript to use with imap-simple nodejs package

首先,介绍一些关于我的测试脚本将涵盖的内容的背景知识。

按下网站上的按钮将向测试邮箱发送一封电子邮件。

这封电子邮件可能需要 10 到 30 分钟才能到达测试邮箱。

因此使用 imap-simple 中的以下代码;

'get new email info': function(browser) {
    imaps.connect(config).then(function (connection) {
        return connection.openBox('INBOX').then(function () {
            var searchCriteria = ['UNSEEN'];
            var fetchOptions = {
                bodies: ['HEADER', 'TEXT'],
                markSeen: false
            };
            return connection.search(searchCriteria, fetchOptions).then(function (results) {
                var subjects = results.map(function (res) {
                    return res.parts.filter(function (part) {
                        return part.which === 'HEADER';
                        })[0].body.subject[0];
                });
            console.log(subjects);

正确返回空白 subjects 数组,因为测试邮箱尚未收到电子邮件。

在脚本开头添加 30 分钟的暂停 'works',因为在 30 分钟之后,subjects 数组将填充为电子邮件(99.99%时间)在 30 分钟内发送 window.

然而,这肯定远非理想,因为电子邮件可能会在 15 分钟内收到,这意味着测试是 'wasting' 15 分钟。

所以我最想做的是编写某种形式的循环(?)来测试 subjects 数组是否已填充。

因此,如果数组已填充,请继续测试脚本的其余部分(这需要测试数组是否包含特定文本)。

如果数组未填充,请再等一分钟再试。

每分钟继续尝试,直到数组被填充。

我试过setIntervalFor循环、While循环等,但我似乎无法让他们工作,老实说我没有想法。

我们将不胜感激任何建议、帮助和参考,如果需要,可以及时添加更多信息。

一种方法是使用递归。

const createPromise = ms => new Promise((resolve, reject) => {
      setTimeout(() => resolve(ms), ms)
    });
    
function findUnseenEmails(connection) {
    return connection.openBox('INBOX').then(function () {
        var searchCriteria = [
            'UNSEEN'
        ];
    
        var fetchOptions = {
             bodies: ['HEADER', 'TEXT'],
             markSeen: false
        };
    
        return connection.search(searchCriteria, fetchOptions).then(function (results) {
            var subjects = results.map(function (res) {
                return res.parts.filter(function (part) {
                    return part.which === 'HEADER';
                })[0].body.subject[0];
            });
            console.log(subjects);
            return subjects.length > 0 ? subjects : createPromise(5000).then(function() { return findUnseenEmails(connection)});
      });
  });
}

imaps.connect(config).then(function (connection) {
      return findUnseenEmails(connection);
    }).then((subjects) => console.log('finished', subjects));

当然存在堆栈溢出的可能性和危险,但在这种情况下,请随时返回堆栈溢出,在我们社区的帮助下找到这里 non-recursive 解决方案。

结果:

编辑: 回答您有关关闭连接的问题:
我会这样做(在 findUnseenEmails 函数中)

if (subjects.length > 0) {
    connection.end();
    return subjects;
} else {
    return createPromise(5000).then(function() { return findUnseenEmails(connection)});
}