【问题标题】:Create loop in Javascript to use with imap-simple nodejs package在 Javascript 中创建循环以与 imap-simple nodejs 包一起使用
【发布时间】:2020-12-23 20:23:03
【问题描述】:

首先,我的测试脚本将涵盖的一些背景知识。

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

这封电子邮件可能需要 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 分钟的暂停,因为在 30 分钟后,subjects 数组被填充,因为电子邮件(99.99% 的时间)在 30 分钟内发送分钟窗口。

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

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

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

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

每隔一分钟继续此尝试,直到填充数组。

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

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

【问题讨论】:

标签: javascript loops setinterval nightwatch.js


【解决方案1】:

一种方法是使用递归。

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

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

结果:

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

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

【讨论】:

  • 非常感谢@matvs 的信息,我会试一试。还有一件事,我还需要添加一个测试以确保输出(subjects)是正确的。我目前在我现有的脚本中有assert.deepEqual(subjects, 'MCN - New enquiry for your bike listing (ref: 1234567)'),但是我将在哪里以及如何在您提供的递归脚本中实现这个断言?谢谢
  • 我猜你可以将断言放在最后一个'then'处理程序中,即 .then((subjects) => console.log('finished', subject))
  • 还要注意,subjects 是一个数组,我不确定如何将 deepEqual 与字符串和数组一起使用。
  • 我添加了一个 sn-p 解决方案来解决 connection.end() 的问题。让我知道它是否有效:)
  • 效果很好,你是明星@matvs!非常感谢您在这方面的帮助,非常感谢。
猜你喜欢
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多