请教egg-cnode中sendMail方法为什么要加for轮询
发布于 6 年前 作者 IEfucker 3044 次浏览 来自 问答

egg-cnode中有段代码不理解,请教下为什么要用for循环 https://github.com/cnodejs/egg-cnode/blob/master/app/service/mail.js#L18

代码

for (let i = 1; i < 6; i++) { try { await transporter.sendMail(data); logger.info(‘send mail success’, data); break; } catch (err) { if (i === 5) { logger.error(‘send mail finally error’, err, data); throw new Error(err); } logger.error(‘send mail error’, err, data); } }

8 回复

看起来是重试机制吧。

@atian25 重试?因为服务器不稳定吗?类似接口不稳定。看nodemailer模块样例代码没有这些

另外for循环和await一起用不理解语法,如果await没有返回,for循环还是会有下一次轮询吗

await 是表示要等待,所以如果await不返回,它是不会进入下一次循环的

@alfredLeeith 我理解也是这样,如果是这样,重试的解释就不对了

我的理解吧,如果await成功了,那就break跳出for循环了,如果一直失败,记录到日志,直到第5次,如果还是失败,则抛出异常。所以我觉得这是一个重试机制

@alfredLeeith await一直不返回会error是吗

@IEfucker await一直不返回,那就一直等呗,直到返回结果,如果成功就跳出,如果error,就被catch到了呗

@alfredLeeith 哦,await的函数栈一定会throw error。学习了,谢谢两位大神

回到顶部