gpt4 book ai didi

javascript - Mongoose 、回调和熊......天哪。无法获取值 :

转载 作者:行者123 更新时间:2023-11-28 03:55:29 26 4
gpt4 key购买 nike

大家好,

我确信我陷入了回调噩梦,试图从传递 {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;
};

我一生都无法让测试变量填充任何东西,也无法让它返回到pendingCount()函数,

我知道有一首关于异步回调函数的歌曲和舞蹈但是..但是..

为什么列表数组可以在其他 Mongoos 函数中看到和写入?而不是在我的其他函数中尝试获取查询 {"repairstatus": "Pending Approval"} 的简单计数?

感谢任何有助于解决此问题的教育反馈。

最佳答案

在第一个示例中,不保证 list 能够正确呈现。如果渲染正确,那是运气(Job.find 的 promise 和 res.render 处于竞争条件,竞相达到list。在这种情况下,res.render恰好获胜。考虑到不同的网络条件、硬件条件或其他随机原因,情况可能并非如此。

如果您想 100% 确定每次都在正确的时间点调用 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}} );
});

对于第二个示例,您将无法简单地返回 test,因为该值是异步填充的。您需要做的是返回一个将解析为所需值的 Promise

从 Mongoose >= 4.0 开始,count 默认会返回一个 Promise,所以你可以直接返回调用 count 的结果:

function pendingCount(){
return Job.count({'repairstatus': 'Pending Approval'});
};

要使用pendingCount,请将其视为Promise:

pendingCount().then(function(count) {
console.log(count);
});

进行这些更改将确保您的代码中没有任何竞争条件,并且每次都会在您需要时执行所有内容。

关于javascript - Mongoose 、回调和熊......天哪。无法获取值 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com