Mongoose:使用 Promise 作为其他函数的参数

Posted

技术标签:

【中文标题】Mongoose:使用 Promise 作为其他函数的参数【英文标题】:Mongoose : using promises as parameters for other functions 【发布时间】: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)

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

【问题讨论】:

【参考方案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(); )

以上是关于Mongoose:使用 Promise 作为其他函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

在 Mongoose 路由中使用 Promise

Mongoose:用 promise 编写自己的方法

在 Mongoose 查询中使用 javascript Promise

如何从Mongoose获取MongoClient对象?

Mongoose Promise 的异步性

节点使用带有 .catch() 语句的 Promise.all 为 Mongoose 请求抛出 UnhandledPromiseRejectionWarning