美好的一天,
我确信我在回调噩梦中纠结于试图通过{query}从Mongoos.count获取简单值。 我可以从回调中获得该值并在控制台中看到它,但是尝试从异步回调设置中获取此信息正在踢我的想法。
我正在使用Node.js和Express尝试执行一些看似简单的任务,从我的模型中获取简单的数字,' Job'查找上面的查询,
我有一个类似的场景,它在router.get的一个实例中工作,并且能够在回调父项函数内写入变量。 功能如下:
router.get('/repairmanager', ensureAuthenticatedAdmin, function(req, res) {
var list = []; // This list populates ok even within the Job.find callback nest hole
if(filter == 'userid' && query != "" || null){
Job.find( {'userid' : new RegExp('^'+query+'$', "i")} )
.then( function(doc){
//console.log(doc);
doc.forEach(function(job){
list.push(job); //<--- Populates just fine and can
// see in res.render {{history}}
});
});
res.render('repairmanager', { history: { 'data' :list}} );
}
)};
以上代码有效,可以填充列表数组......
但是当我应用类似的场景试图从
中获取另一个值时function pendingCount(){
var test = null;
Job.count({'repairstatus': 'Pending Approval'}, function(err, cb){
test = cb;
console.log('test inside callback : ' + test);
});
console.log('test ourside callback : ' + test);
return test;
};
我不能为我的生活获得测试varable来填充什么,也不能让它返回到pendingCount()函数,
我知道有一个关于asyn回调函数的歌曲和舞蹈但是......但是......
为什么列表数组能够在其他Mongoos函数中被看到和写入?而不是在我的其他函数中试图得到一个简单的查询计数{&#34; repairstatus&#34;:&#34; Pending Approval&#34;}?
感谢任何有助于解决此问题的教育反馈。
答案 0 :(得分:0)
在第一个示例中,无法保证.carousel-item {
-webkit-backface-visibility: unset!important;
backface-visibility: unset!important;
}
能够正确呈现。如果它正确渲染,那就是运气(list
的承诺和Job.find
处于竞争状态,竞争到达res.render
。{{1}恰好在这种情况下胜出。鉴于不同的网络条件,硬件条件或其他一些随机原因,情况可能并非如此。
如果您希望100%确定在每个时间的正确时间点调用list
,则需要采取额外的预防措施。
在第一个示例中,您需要将res.render
移到res.render
回调中:
res.render
对于第二个示例,您将无法简单地返回then
,因为此值是异步填充的。您需要做的是返回Job.find( {'userid' : new RegExp('^'+query+'$', "i")} ).then( function(doc){
//console.log(doc);
doc.forEach(function(job){
list.push(job); //<--- Populates just fine and can
// see in res.render {{history}}
});
// render here
res.render('repairmanager', { history: { 'data' :list}} );
});
,它将解析为所需的值。
从Mongoose&gt; = 4.0起,test
默认会返回Promise
,因此您只需返回调用count
的结果:
Promise
要使用count
,您可将其视为function pendingCount(){
return Job.count({'repairstatus': 'Pending Approval'});
};
:
pendingCount
进行这些更改将确保您的代码中没有任何竞争条件,并且每次都会在您希望的时候执行所有操作。