expression/节点,理解渲染模板和asynchronous模型
我有一些麻烦,理解我的应用程序应该如何正确运行加载JSON和渲染模板方面。
想象一下,有路线仪表板,我想从外部API收集一些数据。 我已经创build了自定义文件(tools.js),我有一个从源代码( https.request(options, function(res)) {...}
)中获取数据的https.request(options, function(res)) {...}
,所以基本上这个过程如下所示:
- 我在浏览器中打开我的路线(tools.js开始从外部API中收集JSON)
- 模板呈现,并且tools.js调用的结果仍然是未定义的
- tools.js刚刚结束加载,在控制台显示正确的数据,但模板已经呈现未定义的结果。
我希望这是有道理的。 我明白,这是一个预期的行为,但是如何在从tools.js获取数据之后“重新呈现”模板?
你需要做这样的事情:
tools.js:
var https = require('https'); var options = ... exports.getData = function(cb) { var done = false; function errorHandler(err) { if (!done) { done = true; cb(err); } } https.request(options, function(res) { var buf = ''; res.setEncoding('utf8'); res.on('data', function(d) { buf += d; }).on('end', function() { if (!done) { done = true; var ret; try { ret = JSON.parse(buf); } catch (ex) { return errorHandler(ex); } cb(null, ret); } }).on('error', errorHandler); }).on('error', errorHandler).end(); };
路线:
var getData = require('./tools').getData; // ... app.get('/json', function(req, res) { getData(function(err, data) { if (err) return res.send(500); res.render('mytemplate', { jsondata: data }); }); });
您需要在获取数据后呈现模板。 所以,你等待callback或承诺从你的asynchronous获取数据,并在callback,一旦你有数据,你可以然后呈现你的模板。
如果你发布你的代码,我们可以更具体地帮助。
节点路由handers被devise为asynchronous。 直到你明确地告诉他们你已经完成了对响应对象的适当函数调用,这样他们可以在asynchronous获取数据完成后的一段时间内完成,然后将数据与模板结合起来,然后告诉你完成的响应对象。
- meteor观察arrays服务器端
- 当所有运行并行function完成他们的工作时如何运行callback?
- 如何使用AWS Cognito SDK使用NodeJS从REST服务authentication用户?
- asynchronousI / O和asynchronous函数有什么区别?
- Node.js:你如何处理循环中的callback?
- Nodejsasynchronous执行
- 使用For循环迭代asynchronous函数(db query,Node.js)
- 将一组函数asynchronous传递给一个数组
- 使用node.js +asynchronous模块从同步callback创build同步循环