NodeJS异步回调未完成&渲染车把模板

时间:2017-02-15 04:19:29

标签: node.js express asynchronous mongoose callback

我收到了一条Express GET请求,该请求从Mongoose查询中提取数据,并且对于返回的每个apply plugin: 'io.fabric' dependencies { classpath 'io.fabric.tools:gradle:1.+' } compile('com.crashlytics.sdk.android:crashlytics:2.6.6@aar') { transitive = true; } ,外部函数会对作为doc传递的每个doc执行计算并返回结果,所以我可以使用Handlebars在前端渲染它们。理想情况下,我想执行我的计算x,然后在为每个文档完成后,渲染calcA, calcB, calcC, calcD模板。目前,当我在日志中调用它时页面没有呈现,经过一段时间后,它会显示test-env.hbs,大概是因为回调卡在了某个地方。

快速GET请求

GET /test-env - - ms - -

典型的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}); }); }); }); 功能
我想将calcreturnA添加到returnB数据中,以便我可以在Handlebars中的docs表达式中进行渲染

{{#each}}

2 个答案:

答案 0 :(得分:3)

您没有在异步迭代器中调用回调。如果calc函数是异步的,那么应该单独处理这些回调。如果它们不是异步的,那么正常的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});
            });
            ...

答案 1 :(得分:0)

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

opacity: 1;

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

顺便说一句,你的计算(以及回调函数)是否取决于 async.forEach(doc, function(x, callback){ updates.calcA(x); updates.calcB(x); updates.calcC(x); updates.calcD(x); // <--- callback() needs to go here. } 集合内容的顺序?因为doc方法实际上并不能保证async.forEach中的每个元素的计算顺序与它们在集合中的顺序相同。因此,如果您是,那么如果无序计算可能导致不同的结果,则值得考虑。