如何正确循环通过Twilio功能发送的SMS

时间:2019-03-25 20:29:24

标签: twilio twilio-functions

我有Twilio Studio调用Twilio函数,需要它将电子邮件发送到电子邮件的可变列表(小列表)。这个问题主要是围绕它们的循环,因为我可以很好地传递变量。我有许多电子邮件发送文本到Twilio函数,并且在其中。但是我在网上找到的所有示例都只发送给一个。我的一部分认为这应该是一个Twilio函数,该函数调用另一个Twilio函数(一个循环,另一个发送电子邮件)...但是我不知道这样做的方法。如果我可以将其包含在一个Twilio函数中,那就太好了。

我有Twilio Studio调用了Twilio函数。我需要将所有内容保留在Twilio上...因此,无法通过PHP循环并一次运行一个函数。我需要它在Twilio的无服务器安装程序上运行。

这是我的作品的一个示例:

exports.handler = function(context, event, callback) {
    const sgMail = require('@sendgrid/mail');

    sgMail.setApiKey(context.SENDGRID_API_KEY);

    var responder_emails = 'me@example.com,me+test1@example.com';
    var emails_a = responder_emails.split(',');

    emails_a.forEach(function(responder_email) {
        const msg = {
          to: responder_email,
          from: 'noreply@example.com',
          templateId: 'my-id-goes-here',
          dynamic_template_data: {
            recipient_name: 'John Smith'
          }
        };
        sgMail.send(msg);
    });

    callback();
};

这是我试图以类似的方式循环通过并失败

<div style="margin:-2em;">
    <p>Blah blah blah</p>
</div> 

我可以将多封电子邮件传递给Twilio函数...我只是不确定如何正确遍历。

1 个答案:

答案 0 :(得分:2)

Heyo。 Twilio传播者在这里。

在第一个示例中,您正确地等待使用send完成then调用。在第二个示例中,您错过了这一点。您运行了多个send呼叫,但立即等待不停地呼叫callback

固定的(大致为原型版本)可能如下所示。

exports.handler = function(context, event, callback) {
  const sgMail = require('@sendgrid/mail');

  sgMail.setApiKey(context.SENDGRID_API_KEY);

  var responder_emails = 'me@example.com,me+test1@example.com';
  var emails_a = responder_emails.split(',');

  Promise.all(emails_a.map(function(responder_email) {
    const msg = {
      to: responder_email,
      from: 'noreply@example.com',
      templateId: 'my-id-goes-here',
      dynamic_template_data: {
        recipient_name: 'John Smith'
      }
    };
    return sgMail.send(msg);
  })).then(function() {
    callback();
  }).catch(function(e) {
    callback(e);
  })
});

由于您致电split,因此已经有一系列电子邮件。您可以将此数组与Array.mapPromise.all结合使用。

Map基本上会遍历您的数组,并允许您使用从map内部的函数返回的内容创建一个新的数组。上面的代码所做的是将[email, email]转换为[Promise, Promise]。承诺是sgMail.send的返回值。

现在,您拥有一个保存诺言的数组,当sendgrid接受您的呼叫时,该诺言将解决,您可以使用Promise.all。此方法等待所有诺言得到解决(或拒绝),并向自身返回一个新的诺言,您可以将其与then一起使用。完成所有sendgrid调用后,就可以通过调用函数callback来完成该功能。

旁注:此“ map / Promise.all”技巧可以并行执行所有发送网格调用。在某些情况下,您想称他们为one after another(例如您进行了很多通话并遇到了速率限制)。

希望有帮助,让我知道进展如何。 :)