Javascript 承诺中的猫鼬改变发生得很晚
我正在用NodeJS编写一个API,其中我使用了Mongoose和BlueBird。关于promise chain,我的数据应该通过瀑布函数传递,但事实并非如此。让我的示例从Javascript 承诺中的猫鼬改变发生得很晚,javascript,node.js,mongodb,promise,Javascript,Node.js,Mongodb,Promise,我正在用NodeJS编写一个API,其中我使用了Mongoose和BlueBird。关于promise chain,我的数据应该通过瀑布函数传递,但事实并非如此。让我的示例从getTagNames开始,获取一些JSON,将数据提供给retrieveTag进行查询,最后得到res.JSON() 这是我的玩具数据 function getTagNames(req, res) { var userId = req.params.uid; return new Promise.resolve
getTagNames
开始,获取一些JSON
,将数据提供给retrieveTag
进行查询,最后得到res.JSON()
这是我的玩具数据
function getTagNames(req, res) {
var userId = req.params.uid;
return new Promise.resolve({
'userId': userId,
'variables': [
{ id: 1, name: 'hotel', type: 'String' },
{ id: 2, name: 'location', type: 'String' }
],
})
}
我查询数据的方式。在mongo内部查询之后,我检查是否有一个具有userID
的文档。如果不是,请插入并返回文档。注意Tag
是我的mongo机型
function retrieveTag(data){
Tag.findOne({'userId': data.userId})
.exec()
.then( function(tag){
if (tag) {
console.log('result', tag);
// do something ...
return tag;
}
else {
var newTag = new Tag({
advertiserId: advertiserId,
variables: variables
});
newTag.save()
.then(function () {
console.log('newTag', newTag);
return newTag;
});
}
})
}
这是我的结果(userId
是1
),我的期望是console.log('tags',data)代码>毕竟发生,那么数据
不应该是未定义的
tags undefined
GET /api/tag/values/1 200 3ms
newTag { __v: 0,
userId: '1',
_id: 581b96090e5916cf3f5112fe,
variables:
[ { type: 'String', name: 'hotel', id: 1 },
{ type: 'String', name: 'location', id: 2 } ] }
我的问题是我如何修复它。如果有一些不清楚的地方,请帮我更正。解释有点不清楚,但是如果我正确地理解你,你会在承诺解决链中丢失数据
在阅读代码时,我注意到retrieveTag
并没有返回猫鼬的承诺。要让。然后在getTagValues
中使用retrieveTag
中找到的数据
因此,请改为:
function retrieveTag(data){
return Tag.findOne({'userId': data.userId})
.exec()
.then( function(tag){
...
})
}
解释有点不清楚,但如果我正确地跟随你,你会在承诺解决链中丢失数据
在阅读代码时,我注意到retrieveTag
并没有返回猫鼬的承诺。要让。然后在getTagValues
中使用retrieveTag
中找到的数据
因此,请改为:
function retrieveTag(data){
return Tag.findOne({'userId': data.userId})
.exec()
.then( function(tag){
...
})
}