Node.js承诺:获得&保存结果

时间:2014-06-14 19:27:10

标签: javascript node.js mongoose

我是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;
}

1 个答案:

答案 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);