Как заставить цикл forEach ожидать подстановки регулярного выражения? - PullRequest
0 голосов
/ 18 июня 2019

Я работаю над почтовым веб-приложением, в котором я пытаюсь заменить определенные ключевые слова (имя, фамилию, адрес электронной почты) фактическими свойствами пользователя. В настоящее время я перебираю список получателей и редактирую содержимое электронной почты, которое будет персонализировано с заменой ключевых слов.

Моя проблема: Цикл forEach перепрыгивает через обещание, использованное до того, как я смогу использовать выражение регулярного выражения для замены ключевых слов. Как я могу приостановить цикл, чтобы все ключевые слова были заменены перед переходом к следующей итерации?

recipientList.forEach(function (recipient) {

        let setContent = new Promise((resolve,reject) =>{

                        personalizedContent = replaceAll(emailContent, '[First Name]', firstName);

                        personalizedContent = replaceAll(emailContent, '[Last Name]', lastName);

                        personalizedContent = replaceAll(emailContent, '[Email]', recipient.EmailAddress.Address);

                        resolve(personalizedContent);
                    })

       setContent.then((personalizedContent)=>{
            var message = {
                "Message": {
                    "Subject": subject,
                    "Body": {
                        "ContentType": "html",
                        "Content": personalizedContent
                    },
                    "ToRecipients": [recipient],
                    "Attachments": []
                },
                "SaveToSentItems": "true"
            };
            postEmail(accessToken,message);
        })



    });

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Поскольку replaceAll не является асинхронной операцией, вы можете просто отказаться от использования Promises, и ваш код будет работать синхронно, как предполагается,

 recipientList.forEach(function (recipient) {

      let personalizedContent = replaceAll(emailContent, '[First Name]', firstName);
      personalizedContent = replaceAll(emailContent, '[Last Name]', lastName);
      personalizedContent = replaceAll(emailContent, '[Email]', recipient.EmailAddress.Address);
        var message = {
            "Message": {
                "Subject": subject,
                "Body": {
                    "ContentType": "html",
                    "Content": personalizedContent
                },
                "ToRecipients": [recipient],
                "Attachments": []
            },
            "SaveToSentItems": "true"
        };
        postEmail(accessToken,message);
});
0 голосов
/ 18 июня 2019

Я думаю, что должно быть наоборот.Попробуйте перебрать список получателей внутри обещания и заменить все содержимое, затем при обратном вызове повторите итерацию списка, чтобы обновить сообщение в сообщении электронной почты.

...