繁体   English   中英

将 Promise 链成一条链

[英]Chain Multiply Promises into one chain

我有 Express 和 Mongo 的登录逻辑。 我需要将它们放入一个 promise 链中并避免嵌套承诺。

这是我的代码:

    const foundUser = User.findOne({ email: email }).exec();
    const hashedPassword = bcrypt.hash(password, 10);

    return Promise.all([foundUser, hashedPassword])
        .then(arr => {
            const [ user, hashedPassword ] = arr;

            if (user) {
                return res.status(400).json({
                    message: "This email has already occupied."
                });
            };

            const newUser = new User({
                fullName,
                email,
                password: hashedPassword
            });

            newUser.save()
            .then(user => {
                return res.status(200).json({
                    message: `${user.fullName}, you are successfully registered.`
                });
            })
            .catch(err => {
                console.log(err);
                return res.status(500);
            })
        })
        .catch(err => {
            console.log(err);
            return res.status(500);
        });

我尝试将它们与Promise.all结合使用,但我的一个承诺取决于前一个,所以我在 then 中添加了newUser.save()

我实现了这样的异步/等待:

const foundUser = await User.findOne({ email: email }).exec();

if (foundUser) {
    return res.status(400).json({
        message: "This email has already occupied."
    });
}

const hashedPassword = await bcrypt.hash(password, 10);

const newUser = new User({
    fullName,
    email,
    password: hashedPassword
});

const user = await newUser.save();

return res.status(200).json({
    message: `${user.fullName}, you are successfully registered.`
});

} catch (err) {
    console.log( err);
    return res.status(500).json({
        message: 'Error'
    })
}

但我想知道有没有办法通过承诺而不嵌套来做到这一点。 我需要将它们放在一条链上,这样我就可以避免使用多重捕获

正如评论中提到的@Bergi,您可以从.then回调中返回 promise 。 根据返回的 promise 是否得到解决或拒绝,将调用链中的.then.catch下一个。 你可以这样做:

    const foundUser = User.findOne({ email: email }).exec();
    const hashedPassword = bcrypt.hash(password, 10);

    return Promise.all([foundUser, hashedPassword])
        .then(arr => {
            const [ user, hashedPassword ] = arr;

            if (user) {
                return res.status(400).json({
                    message: "This email has already occupied."
                });
            };

            const newUser = new User({
                fullName,
                email,
                password: hashedPassword
            });

            return newUser.save()
        })
        .then(user => {
            return res.status(200).json({
                message: `${user.fullName}, you are successfully registered.`
            });
        })
        .catch(err => {
            console.log(err);
            return res.status(500);
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM