gpt4 book ai didi

javascript - 将嵌套回调转换为 Promise

转载 作者:行者123 更新时间:2023-11-28 18:18:03 25 4
gpt4 key购买 nike

我想尝试将此函数转换为基于 Promise 的函数,以便解决来自 ESLint consistent-return 的所有这些嵌套回调和返回警告。 .

之前,我在这里寻求一些帮助来克服我的 return 语句的 ESLint 错误,因为它们不一致或遵循 JS 的最佳实践。

我的第一个想法是简单地在 remove 函数中执行 return new Promise((resolve,reject) => {...}) ,但这只会 promise 整个事情,而不仅仅是函数内部的内容,所以我觉得这不是最好的方法。

感谢任何帮助!

function remove(req, res) {
User.findOne({ username: req.params.username }, (findErr, existingUser) => {
if (findErr) return res.status(500).send(errorHandler.getErrorMessage(findErr));
if (!existingUser) return res.status(404).send({ message: 'User not found' });

existingUser.remove((removeErr) => {
if (removeErr) return res.status(500).send(errorHandler.getErrorMessage(removeErr));

return res.json({ message: `${existingUser.username} successfully deleted` });
});
});
}

最佳答案

这是另一种方法。我首先将每个 findOneremoveUser “ promise ”为单独的函数。然后,您的路线几乎会自动简化。

您仍然可以在此处进行一些改进,但也许您可以从中学到一些东西。

(感谢@Bergi 的有用建议)

const error = (type, message) => Object.assign(new Error(message), {type});
const wrapError = type => err => { throw error(type, errorHandler.getErrorMessage(err));};

const findUser = opts => {
return new Promise((resolve, reject) => {
User.findOne(opts, (err, user) => {
if (err) reject(err);
else resolve(user);
});
}).then(user => {
if (!user) throw error('USER_NOT_FOUND', 'User not found')
else return user;
}, wrapError('USER_FIND_ERROR'));
};

const removeUser = user => {
return new Promise((resolve, reject) => {
user.remove(err => {
if (err) reject(err);
else resolve();
});
}).catch(wrapError('USER_REMOVE_ERROR'));
};

function remove(req, res) {
findUser({ username: req.params.username })
.then(removeUser)
.then(() => res.json({message: `${req.params.username} successfully removed`}))
.catch(error) => {
switch (error.type) {
case 'USER_NOT_FOUND':
return res.status(404).send(error.message);
// case 'USER_FIND_ERROR':
// case 'USER_REMOVE_ERROR':
default:
console.error(error.type, error.message, error.stack);
return res.status(500).send(error.message);
}
});
}

关于javascript - 将嵌套回调转换为 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40493290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com