为了账号安全,请及时绑定邮箱和手机立即绑定

一个关于promise的问题

一个关于promise的问题

慕侠2389804 2018-09-07 09:17:21
User.registerAsync(new User(body), password).then(user => crypto.randomBytesAsync(20)).then(buf => {    user.activeToken = user._id + buf.toString('hex');    user.activeExpires = Date.now() + 24 * 3600 * 1000;    var link = config.URL + '/#/account/login/' + user.activeToken;    mailer({        to: body.username,        subject: '欢迎注册依萨卡后勤端',        html: '请点击 <a href="' + link + '" target="_blank">此处</a>激活'    });    return user.save();}).then(user => res.json({message: `已发送邮件至${ user.username }请在24小时内按照邮件提示激活`})).catch(err => next(err));我想在第二个then方法中获得上一个promise的参数,也就是user。我这里是不是不应该再返回一个promise,而应该直接在前一个then方法中继续编写代码,可我觉得这样嵌套了不是很优雅,不知道有什么解决方案?我这里用的是bluebird。不知道该不该用.all方法,因为这里的promise链还是有一定的逻辑顺序的。
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

这个是不是你想要的

之前没注意到 crypto.randomBytesAsync(20) 是个异步调用,返回的 Promise,我查了下 bluebird 的 API,和 ES6 的 Promise 差不多,所以大概应该改成这样:

User.registerAsync(new User(body), password)

    .then(user => Promise.all([user, crypto.randomBytesAsync(20)]))

    .then(result => {

        const user = result[0];

        const buf = result[1];


        user.activeToken = user._id + buf.toString("hex");

        user.activeExpires = Date.now() + 24 * 3600 * 1000;

        var link = config.URL + "/#/account/login/" + user.activeToken;

        mailer({

            to: body.username,

            subject: "欢迎注册依萨卡后勤端",

            html: "请点击 <a href=\"" + link + "\" target=\"_blank\">此处</a>激活"

        });

        return user.save();

    })

    .then(user => res.json({ message: `已发送邮件至${user.username}请在24小时内按照邮件提示激活` }))

    .catch(err => next(err));


查看完整回答
反对 回复 2018-10-09
  • 1 回答
  • 0 关注
  • 444 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信