我是Node.js承诺的新手,我想做一些非常基本的事情:检索历史数据库中的“搜索”条目,检索历史记录中的“页面”条目,然后显示两者。
我写了这段代码,但它不起作用。第二个get_entries_of
不起作用,因为在有足够的时间调用数据库之前调用最终的console.log
。你能救我吗?
var history = {};
var savePage = function(obj)
{
history.page = obj;
}
var saveSearch = function(obj)
{
history.search = obj;
}
var displayHistory = function()
{
console.log(history);
}
/** Promises chain */
historyLib.get_entries_of(uid, "page")
.then(function(obj) {
savePage(obj);
historyLib.get_entries_of(uid, "search");
}, console.log)
.then(function(obj) {
saveSearch(obj);
displayHistory();
}, console.log);
get_entries_of:
function get_entries_of(uid, type, date_start, date_end)
{
var deferred = Q.defer();
var extra = "";
if(typeof(date_start) !== 'undefined')
extra = ' ,"date": {"$gte": ' +date_start+ ', "$lt": ' +date_end+ '}';
history[type].find({ _uid: mongoose.Types.ObjectId(uid) + extra}, deferred.makeNodeResolver());
return deferred.promise;
}
答案 0 :(得分:1)
如果没有更多详细信息,您的第一个承诺回调似乎不会返回承诺。所以第一次搜索可能需要看起来像这样:
historyLib.get_entries_of(uid, "page")
.then(function(obj) {
savePage(obj);
return historyLib.get_entries_of(uid, "search");
}, console.log)
.then(/* go on here with the second search */)`
再一次:return historyLib.get_entries_of(uid, "search");
注意我们在这里回复一个承诺?实际上我们返回任何get_entries_of返回,这是一个承诺。这意味着整个回调(function(obj){})也将返回一个promise,并且该函数返回的任何内容都将附加在promise链上。
这就是为什么你的第二个承诺也会起作用的原因。否则看起来你的第一个然后(cb)回调(cb
事件)返回undefined,你不能调用未定义的then()
。
你的console.log说什么呢?
另外在旁注中,您确定此查询在传递start_date时也有效吗?
这个:{ _uid: mongoose.Types.ObjectId(uid) + extra}
看起来不正确,但我可能错了。对我而言,看起来你想要:
var criteria = {_uid: uid};
if(date_start) {
criteria.date = {
$gte: date_start
};// etc
}
stuff.find(criteria, callback);