NodeJSasynchronouscallback不完成&呈现把手模板

我有一个Express GET请求,从Mongoose查询中提取数据,并且为每个返回的doc ,外部函数对作为x传递的每个doc执行计算,并返回结果,以便使用Handlebars将其呈现在前端。 理想情况下,我想进行calcA, calcB, calcC, calcD计算calcA, calcB, calcC, calcD然后在每个文档完成后,渲染test-env.hbs模板。 目前,当我打电话时,页面没有呈现,在日志中,一段时间之后,它显示GET /test-env - - ms - - ,可能是因为callback卡住了某处。

快速GET请求

 var updates = require('./updates.js'); app.get('/test-env', function(req, res, next){ Market.find({"marketname" : 'To Win'}) .then(function(doc){ async.forEach(doc, function(x, callback){ updates.calcA(x); updates.calcB(x); updates.calcC(x); updates.calcD(x); }, function(err){ if(err) return console.log(err); res.render('test-env', {title: 'Test Page', items: doc}); }); }); }); 

典型的calc函数
我想将returnAreturnB添加到docs数据中,以便在Handlebars中的{{#each}}expression式中呈现它

 calcA: function(x) { Market.find({"student": x.student, "marketname": x.marketname}) .sort({btotal: -1}) .limit(1) .then(function(ret) { var valueA = ret[0].btotal; var valueB = ret[0].back; Market.find({"student": x.student, "marketname": x.marketname, "back": {$lt: valueB}}) .sort({odds: -1}) .limit(1) .then(function(doc) { var res = doc[0]; if (res == null) { x.returnA = 0; x.returnB = 0; } else { x.returnA = res.back; x.returnB = res.btotal; } }); }); } 

你不是在你的asynchronous迭代器中调用你的callback函数。 如果calc函数是asynchronous的,则应该单独处理这些callback。 如果他们不是asynchronous的,一个正常的forEach将会诀窍。

  ... async.forEach(doc, function(x, callback){ updates.calcA(x); updates.calcB(x); updates.calcC(x); updates.calcD(x); callback(); // Call the callback to move on to the next item }, function(err){ if(err) return console.log(err); res.render('test-env', {title: 'Test Page', items: doc}); }); ... 

它看起来好像你实际上没有调用你的callback函数。

  async.forEach(doc, function(x, callback){ updates.calcA(x); updates.calcB(x); updates.calcC(x); updates.calcD(x); // <--- callback() needs to go here. } 

看看: http : //caolan.github.io/async/docs.html#each该示例显示您需要显式调用callback()函数。

顺便说一下,你的计算(和callback函数)取决于doc集合内容的顺序吗? 因为async.forEach方法实际上并不能保证doc中的每个元素都将按照它们在集合中的顺序进行计算。 所以,如果你是,那么值得考虑的是,无序的计算可能会导致不同的结果。