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
中的每个元素都将按照它们在集合中的顺序进行计算。 所以,如果你是,那么值得考虑的是,无序的计算可能会导致不同的结果。
- 节点邮件程序错误:“不支持的configuration,降级Nodemailer到v0.7.1使用它”在本地主机
- 如何在使用Node.js时在客户端和服务器之间共享代码
- Node.js – 设置默认局部variables传递到布局/模板
- 如何使用Mongoose,Express,Angular 4和NodeJS上传/保存和显示图片
- express / node.js中的请求之间的同步问题
- 找不到公共目录(404)ExpressJS和Jade
- 表示不提供静态文件
- 如何使用Express在Node.js中打印响应正文(或POST时的请求正文)?
- 节点js express中'app.resource'的用法是什么?