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

问题描述

首先,了解我的测试脚本要涵盖的内容

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

此电子邮件可能需要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);

正确返回一个空白的主题数组,因为测试邮箱尚未收到该电子邮件

在脚本“作品”的开头添加30分钟的暂停时间,因为在30分钟后填充了 subjects 数组,原因是在30分钟内发送了电子邮件(占99.99%的时间)分钟窗口。

但是,绝对不理想,因为可能会在15分钟内收到电子邮件,这意味着测试在15分钟内“浪费”了。

所以我理想地要做的是编写某种形式的循环(?),以测试是否填充了主题数组。

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

如果未填充该阵列,请等待一分钟再尝试。

每分钟继续尝试一次,直到填充阵列。

我尝试了 setInterval 用于循环,同时循环等,但是我似乎无法使它们正常工作,我说实话,我没有主意。

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

解决方法

一种方法是使用递归。

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

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

结果:

Gif with result

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...