CNode

请教egg-cnode中sendMail方法为什么要加for轮询

问答
IIEfucker发布于8 年前最后回复8 年前8 回复4291 浏览0 收藏

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)

A
atian25#1·8 年前

看起来是重试机制吧。

I
IEfucker#2·8 年前
引用 atian25看起来是重试机制吧。

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

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

A
alfredLeeith#3·8 年前

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

I
IEfucker#4·8 年前
引用 alfredLeeithawait 是表示要等待,所以如果await不返回,它是不会进入下一次循环的

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

A
alfredLeeith#5·8 年前

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

A
alfredLeeith#7·8 年前
引用 IEfucker@alfredLeeith await一直不返回会error是吗

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

I
IEfucker#8·8 年前
引用 alfredLeeith@IEfucker await一直不返回,那就一直等呗,直到返回结果,如果成功就跳出,如果error,就被catch到了呗

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

参与回复
登录后即可参与回复。登录