在Array.map函数中使用await

在迭代数组之前,我需要等待一个asynchronous函数完成,我需要等待parsing的asynchronous函数如下:

static async sendEmail (from, to, subject, text) { return new Promise((resolve, reject) => { let message = { from, to, subject, text }; AMMailing.transporter.sendMail(message, function (err, response) { if (err) { reject(err); } else { resolve(response); } }); }); } 

这是我在数组中迭代的方式的代码,并试图等待它解决再次迭代之前:

 static sendEmailInQueue (queue) { queue.map(async (person, index) => { console.log('sending email to: ', person.email); try { let success = await AMMailing.sendEmail(AMMailing.message.from, person.email, AMMailing.message.subject, AMMailing.message.text); if (success) { console.log('email sent to: ', person.email); } } catch (err) { console.log(err); } }); } 

我的问题是:这行console.log('sending email to: ', person.email); 被执行所有的时间,然后AMMailing.sendEmail()函数开始logging它的结果

这是我在控制台中得到的输出:

 sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com sending email to: matheus.rezende10@gmail.com { Error: Hostname/IP doesn't match certificate's altnames: "Host: mail.appmasters.io. is not in the cert's altnames: DNS:*.sgcpanel.com, DNS:sgcpanel.com" 

你不需要在你的例子中使用map ,它不映射任何东西。 你可以用for循环迭代你的数组,依次等待每个项目。 例如:

 static async sendEmailInQueue (queue) { // async method for (let i = 0; i < queue.length; i++) { try { // await sequentially let success = await AMMailing.sendEmail(/* ... */); if (success) { console.log('email sent to: ', person.email); } } catch (err) { console.log(err); } } } 

您可能总是使用一个Promise.resove()初始值为Promise.resove()并对您的promisifiedasynchronous任务进行sorting。

假设我们的asynchronoussendMail(msg,cb)函数在0-250ms内发送一封邮件。 我们可以在sendMessages函数中将它提交(如果它没有返回一个promise),并且在.reduce()中的.then .then()阶段中将这些promise传递给它。

 function sendMail(msg, cb){ setTimeout(cb, Math.random()*250, false, "message to: " + msg.to + " is sent"); } function sendMessages(ms){ function promisify(fun, ...args){ return new Promise((v,x) => fun(...args, (err,data) => !!err ? x(err) : v(data))); } ms.reduce((p,m) => p.then(v => promisify(sendMail,m)) .then(v => console.log(v)), Promise.resolve()); } var msgArray = [{from: "x", to: "John@yyz.com", subject: "", text:""}, {from: "y", to: "Rose@ist.com", subject: "", text:""}, {from: "z", to: "Mary@saw.com", subject: "", text:""} ]; sendMessages(msgArray);