【问题标题】:Mongoose : using promises as parameters for other functionsMongoose:使用 Promise 作为其他函数的参数
【发布时间】:2018-08-16 21:45:29
【问题描述】:

我试图很好地理解如何使用 Promise,主要是因为我想查询数据,然后使用该数据查询其他数据

我有这个架构:

var serviceSchema = new Schema({
name: String,
});

还有这个方法就可以了:

serviceSchema.statics.getIdByName = function getIdByName (serviceName) {

this.findOne({name :serviceName }).exec(function(err, service){
    if(err) console.log(err)

    return service._id

})
}

在我的代码中,我想做类似的事情:

var service_id = Service.getIdByName("facebook")
otherSchema.findOne({service : service_id}).exec(...)

但是 service_id 是一个承诺,所以查询不正确,我不想陷入回调地狱并在回调等内部调用模型 我尝试过类似的异步操作

async.series([getVariables], function(err, results){
otherSchema.findOne({service : service_id}).exec(...)})

getVariables 在哪里:

function getVariables(callback1) {
if(service_id!=undefined) {
    callback1(serviceID)
}}

非常欢迎任何有关如何实现这一目标的帮助! 非常感谢

【问题讨论】:

    标签: node.js express mongoose promise async.js


    【解决方案1】:

    这个问题的答案实际上是使用 async/await and and do var x = await Model.findOne().exec()

    或者任何返回promise的函数,那么你可以在代码的任何地方使用x

    【讨论】:

      【解决方案2】:

      试试这个exec() 返回承诺。

      serviceSchema.statics.getIdByName = function getIdByName(serviceName) {
          return this.findOne({
              name: serviceName
          }).exec();
      }
      

      调用 getIdByName 函数

      Service.getIdByName("facebook").then((data) => {
          console.log(data)
      })
      

      【讨论】:

      • 非常感谢您的回答,这并不能解决我的问题,因为 getIdByName 现在只是一个 findOne 函数,我只能在我想在外部访问的“then”内访问服务的 ID,存储在一个变量中,我可以将其作为参数传递给另一个查询,这是否意味着我只能在“then”中执行此操作?不是回调地狱吗,因为实际上我必须在进行查询之前获得很多 id
      • @mtths 它不会创建回调地狱,因为您可以创建承诺链,而不是回调地狱。
      • 你尝试了什么?
      • 这里有一个更易读的版本:Service.findOne({name : 'JollyClick'}).then(function(service){ var service_id = service._id return Data.findOne({name : "Objectifs "}).exec() }) .then(function(data){ var objectifsID = data._id return Data.findOne({name : 'Personnalité'}).exec() })。然后(函数(data2){ var personnaliteID = data2._id DataUse.create({service:service_id,user:service_id,data:dataTypesIds},function(err,datause){})当我想创建我的文档时无法访问service_id
      • .then 外部声明service_id 并在.then 内部赋值。 var service_id; Service.findOne({ name: 'JollyClick' }).then(function (service) { service_id; = service._id return Data.findOne({ name: "Objectifs" }).exec(); })
      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 2019-03-11
      • 2019-10-30
      • 2021-07-30
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多