Mongoos,Callbacks和Bears ..哦,我的。无法获得价值观:

时间:2017-11-30 20:38:32

标签: javascript express callback handlebars.js

美好的一天,

我确信我在回调噩梦中纠结于试图通过{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;}?

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

1 个答案:

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

进行这些更改将确保您的代码中没有任何竞争条件,并且每次都会在您希望的时候执行所有操作。