javascript - 一个关于promise的问题
天蓬老师
天蓬老师 2017-04-11 12:37:59
[JavaScript讨论组]
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: '请点击 此处激活'
    });
    return user.save();
})
.then(user => res.json({message: `已发送邮件至${ user.username }请在24小时内按照邮件提示激活`}))
.catch(err => next(err));

我想在第二个then方法中获得上一个promise的参数,也就是user。我这里是不是不应该再返回一个promise,而应该直接在前一个then方法中继续编写代码,可我觉得这样嵌套了不是很优雅,不知道有什么解决方案?我这里用的是bluebird。不知道该不该用.all方法,因为这里的promise链还是有一定的逻辑顺序的。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(1)
黄舟

这个是不是你想要的

之前没注意到 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));
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号