d3许诺立即启动-不等待数据

时间:2018-08-27 19:19:01

标签: node.js d3.js es6-promise

我是新来的。我对结合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有什么意义?如何使其运作?我觉得我在这里想念一些东西,需要建议。谢谢。

1 个答案:

答案 0 :(得分:0)

这与d3端的诺言无关,而是您在服务器上处理请求的方式。

在服务器上,您设置了一些异步过程来构造您要服务的响应。请求处理程序将等待异步进程准备好创建响应。

如果要立即提供结果,请

不要在服务器上的请求处理中执行异步操作。如果您有来自不同用户的多个请求,则使用本地服务器文件非常糟糕。 (这是从另一个用户获取数据的一种方法。)您需要在服务器上等待结果。