繁体   English   中英

Node.js承诺:获取并保存结果

[英]Node.js Promises: get & save results

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

如果没有更多详细信息,则您的第一个promise回调似乎不会返回promise。 因此,第一次搜索可能需要如下所示:

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链上。

这就是为什么您的第二个承诺也将起作用的原因。 否则,它看起来像您的第一个then(cb)回调( cb事物)返回undefined,并且您无法调用undefined的then()

无论如何,您的console.log说什么?

另外,请注意,当您也将start_date传递给该查询时,您确定该查询有效吗? 这: { _uid: mongoose.Types.ObjectId(uid) + extra}{ _uid: mongoose.Types.ObjectId(uid) + extra}看起来不正确,但我可能是错的。 在我看来,您似乎想要:

var criteria = {_uid: uid};
if(date_start) {
    criteria.date = {
        $gte: date_start
    };// etc
}
stuff.find(criteria, callback); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM