【问题标题】:ES6 nested promisesES6 嵌套承诺
【发布时间】: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


【解决方案1】:

好吧,很抱歉,但最后我只是把 Sequelize Model 实例误认为是 Promise。 我没有在参数中给出承诺,因此一切都很好,我只需要从该实例中获取普通对象

email.nodeValues

感谢所有帮助过的人

【讨论】:

    【解决方案2】:

    这个怎么样?

    validate(req.body, bodyValidationSchema)
    .then(validated_data => {
        return db.model.create(validated_data, other_parameters);
    })
    .then(console.log)
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2019-05-22
      相关资源
      最近更新 更多