我正在使用承诺而我遇到了一个问题,这更像是一个最佳实践问题。
我有一个函数,它返回一个解析为对象的promise(验证对象):
validate(req.body, bodyValidationSchema)
我有另一个函数,从验证数据在数据库中创建一个对象,并将一个promise解析为创建的对象:
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()”但是在更大的任务之后,它将不会等待最后一个任务(我不知道这是否非常明确...)
非常感谢, Giltho
编辑:以下是显示问题的实际代码
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行打印“电子邮件”,它不是一个普通的对象,而是一个解析为一个的承诺。 因此,验证不起作用,只是将所有内容剥离......
答案 0 :(得分:1)
嗯,对不起,但最后我误认为Sequelize Model实例为Promise。 我没有在参数中给出一个承诺,因此一切都很好我只需要从该实例中获取普通对象
email.nodeValues
感谢所有帮助过的人
答案 1 :(得分:-4)
这个怎么样?
validate(req.body, bodyValidationSchema)
.then(validated_data => {
return db.model.create(validated_data, other_parameters);
})
.then(console.log)