在转到 twilio 无服务器函数中的下一行代码之前,如何让我的 for await 循环在其主体内执行所有操作?

How do I make my for await loop do everything within its body before moving on to the next line of code in twilio serverless functions?

几天来我一直在研究这个问题,感觉我已经非常接近解决这个问题了。在继续下一行代码之前,我需要循环遍历一个对象并向对象中的每条记录发送一条文本消息。要发送的代码在本地隔离时有效。但我无法让它在 Twilio Functions 中运行。我的所有代码似乎都有效,但未发送短信。

    for await (const contact of allItems) {
      client.messages
      .create({
      body: "Hey " + contact.name + "!" + " " + message,
      messagingServiceSid: messaging_service,
      to: contact.key
      });
    };
    
  // End Send Message to Each Contact

我附上了我认为有问题的部分代码。

我想做的是让这段代码 运行 完全完成,然后再继续接下来的几行并调用回调。

知道我怎么能做这样的事情吗?

此处为 Twilio 开发人员布道师。

这里的问题是您没有await获取异步调用的实际结果。在本地,这无关紧要,但在 Twilio Functions 中,一旦您调用 callback 函数,所有已启动的异步调用都会终止。

要创建一个发出异步请求并等待它们全部完成的循环,您需要将 Promise.allmap 结合使用。在您的示例中,它应该如下所示:

function SendMessages(allItems, message, client, messagingService) {
  const apiRequests = allItems.map((contact) => {
    let usersName = contact.name;
    return client.messages.create({
      body: `Hey ${usersName}! ${message}`,
      messagingServiceSid: messagingService,
      to: contact.key,
    });
  })
  return Promise.all(apiRequests);
}

在此函数中,我们映射联系人列表,返回我们尝试发送消息时创建的承诺。变量 apiRequests 成为代表对 API 的请求的承诺数组。然后我们可以在 Promise.all 中使用这个 promises 数组。 Promise.all 只有在它传递的所有承诺都已解决(或者如果一个承诺被拒绝)后才会解决。

我建议您阅读 ,因为这会带来一些您可能遇到的其他问题。