我是新来的。我对结合EJS模板系统和D3.js渲染库的node.js遇到问题。
node.js文件:
router.post('/foo', function(req, res) {
fs.unlink('./public/d3.json'); // we delete old data (if exist)
res.render('foo'); // page render
//lets suppose that here we request some async data and put them to the array via promises
let array = []; // our array with data
Promise.all(array).then(function(all) { //when we download all the necessary data...
var newArray = JSON.stringify(array);
fs.writeFile('./public/d3.json', newArray, 'utf-8', function(err) { //we write it to file - so chart file bellow can render it
if (err) {
console.log('writing public/d3.json file with newArray failure] - ' + err);
}
else {
console.log('public/d3.json file with content of newArray has been created.');
}
});
});
}
module.exports = router;
我的EJS文件如下:
<html>
<head></head>
<body>
<div class="chart"></div>
<script>
<% include ../public/d3.js %> // d3 library
<% include ../public/d3_chart.js %> // chart render code
</script>
</body>
</html>
我的图表文件如下:
d3.json("../public/d3.json", cb);
function cb(error, data) {
if (error) {
console.log(error);
}
if (data) { // render chart
}
}
但这不起作用。它没有渲染任何内容-可能是因为ejs模板运行d3_chart.js时d3.json文件上没有数据。但是,不应该保证等待数据然后呈现图表吗?否则,在d3中使用promises有什么意义?如何使其运作?我觉得我在这里想念一些东西,需要建议。谢谢。
答案 0 :(得分:0)
这与d3端的诺言无关,而是您在服务器上处理请求的方式。
在服务器上,您设置了一些异步过程来构造您要服务的响应。请求处理程序将不等待异步进程准备好创建响应。
如果要立即提供结果,请不要在服务器上的请求处理中执行异步操作。如果您有来自不同用户的多个请求,则使用本地服务器文件非常糟糕。 (这是从另一个用户获取数据的一种方法。)您需要在服务器上等待结果。