ES6嵌套承诺

时间:2017-05-16 19:34:31

标签: javascript node.js asynchronous promise

我正在使用承诺而我遇到了一个问题,这更像是一个最佳实践问题。

我有一个函数,它返回一个解析为对象的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行打印“电子邮件”,它不是一个普通的对象,而是一个解析为一个的承诺。 因此,验证不起作用,只是将所有内容剥离......

2 个答案:

答案 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)