【发布时间】:2019-12-29 12:07:48
【问题描述】:
我查看了Brad Traversy's User routes for DevConnector,这是他用来教授 Node.js 的一个项目。在我看来,代码看起来不够简洁或不言自明;例如,看看/register 路线 - 它都写在一个大块中。我想知道在其他承诺中包装承诺是否可以解决这个问题。
下面是我的替代方案:
router.post('/register', (req, res) => {
const firstName = req.body.firstName;
const lastName = req.body.lastName;
const email = req.body.email;
const password = req.body.password;
const dateOfBirth = req.body.dateOfBirth;
buildUserIfNotExists(email, firstName, lastName, dateOfBirth)
.then(user => hashUserPassword(user, password, 10))
.then(user => saveUser(user))
.then(user => {
sendActivationLink(user);
res.json(user);
})
.catch(errors => {
if (errors.internalError) {
console.log(errors.internalError);
res.status(500).json({
internalError: 'An internal error occured.'
})
} else {
res.status(400).json(errors);
}
});
});
我看到的 Promise 包装器的一个例子是:
function saveUser(user) {
const errors = {};
return new Promise((resolve, reject) => {
user
.save()
.then(user => resolve(user))
.catch(err => {
errors.internalError = err;
reject(errors);
})
});
}
到目前为止,我对这种方法没有任何问题,一切都按预期工作。我想念这个有什么缺点吗?有什么办法可以进一步简化?
【问题讨论】:
-
虽然这个标题和above proposed dup的标题一致,但内容完全不是重复的。其他问题是关于重试的特定情况,与此不同。这可能有一个重复,但上面的链接不是它。
标签: javascript asynchronous concurrency promise es6-promise