【发布时间】:2017-05-17 07:00:13
【问题描述】:
我正在使用 Promise,但我遇到了一个问题,这更像是一个最佳实践问题。
我有一个函数可以返回解析为对象(已验证对象)的承诺:
validate(req.body, bodyValidationSchema)
我有另一个函数,从验证数据在数据库中创建一个对象,并返回一个解析到创建的对象的承诺:
db.model.create(validated_data, other_parameters)
但是,我不能只使用它们链接这些函数,例如:
validate(req.body, bodyValidationSchema)
.then(validated_data => db.model.create(validated_data, other_parameters))
.then(console.log)
因为,最后一行不会打印 created_object 而是将 Promise 解析为已创建对象。 因此我必须做这样的事情,嵌套承诺:
validate(req.body, bodyValidationSchema)
.then(validated_data =>
db.model.create(validated_data, other_parameters)
.then(console.log)
)
有没有更好的方法来做到这一点? 此外,如果我用异步任务替换 console.log 并在该任务之后而不是在更大的任务之后添加另一个“.then()”,它不会等待最后一个任务(我不知道这是否非常清楚...)
非常感谢, 吉尔索
编辑:这是显示问题的实际代码
function createEmailView(req, res) {
validate(req.body, emailCreationSchema)
.then(validatedBody =>
db.Email.create({ email: validatedBody.email, userLogin: req.user.login }))
.then(email => validate(email, emailSchema, { stripUnknown: true }))
.then((validatedEmail) => { console.log(validatedEmail); return validatedEmail; })
.then((validatedEmail) => {
res.status(201).json(validatedEmail);
})
.catch((error) => {
if (error instanceof Sequelize.ValidationError || error.isJoi) {
res.status(400).json(makeStandardErrorOfValidationError(error));
} else {
res.status(500).json(error);
}
});
}
如果我尝试在第 3 行打印“电子邮件”,它不是一个普通的对象,而是一个解决为一个的承诺。 因此验证不起作用,只是剥离了所有内容......
【问题讨论】:
-
“但是,我不能只使用它们链接这些函数,例如” 应该可以。你在使用原生 Promise 吗?
-
从传递给
then的回调中返回一个承诺将在链中解决该承诺,因此您那里的代码应该可以工作。 -
不清楚是什么问题;如果
create返回一个 Promise 应该没问题。 -
如果 db.Email.create() 返回一个 Promise,然后通过将它传递给 Promise.resolve() 你将它包装在另一个 Promise 中。所以你应该摆脱对初学者的 Promise.resolve 调用。
-
就像其他人所说的,如果你的 Promise 是 Promises/A+ 兼容的,那么
then回调就不可能以 Promise 作为参数被调用。在使用承诺值调用then回调之前,该承诺将自动解决。您能否在问题中显示确切记录的内容以及您承诺validate的代码?
标签: javascript node.js asynchronous promise