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
函数
我想将returnA
和returnB
添加到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
中的每个元素都将按照它们在集合中的顺序进行计算。 所以,如果你是,那么值得考虑的是,无序的计算可能会导致不同的结果。
- pipe道将Gulpstream文件的内容连接到服务器(connect,express或http)响应
- 大多数中间件(如compress)不再与Express捆绑在一起
- php-node Node Express无法find模块
- Node.js – 在中间件中使用res.redirect
- Node.js不能正确parsing外部的javascript
- 在Express中使用*路由时,从不存在的静态内容发送404头
- 我试图通过setInterval()重新渲染我的帕格模板。 这可能吗?
- TypeError:Router.use()需要中间件function
- 如何dynamic地决定请求是否应该通过Express中间件