Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js d3承诺立即启动-不等待数据_Node.js_D3.js_Es6 Promise - Fatal编程技术网

Node.js d3承诺立即启动-不等待数据

Node.js d3承诺立即启动-不等待数据,node.js,d3.js,es6-promise,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

我是新来的。结合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中使用承诺有什么意义?如何让它工作?我觉得我错过了一些东西,需要一个建议。谢谢。

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

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


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

在服务器上,您将URL
/foo
路由到json文件服务,或者写入
public/d3.json
但请求
。/d3js/d3.json
。你在服务器日志中看到了什么,在浏览器控制台和网络选项卡上看到了什么?是的,这是一个简单的错误输入-在服务器上代码是好的,文件路径不是这样。现在回到问题上来,当我在开始时删除d3.json文件并运行应用程序时,我得到的错误是没有d3.json。若我不删除它,图表将显示过时的数据。所以它会在d3_chart.js加载后立即读取文件。。。承诺不要等待数据。我刚刚使用socket.io传输数据,但我真的想知道为什么它不能使用d3.json命令。“请求处理程序不会等待异步进程准备好创建响应。”明白了。但是socket.io工作得很好,服务器异步获取数据(在请求“队列”-router.POST中),继续工作,将其发送给用户。“如果您想立即为结果提供服务,请不要在服务器上处理请求时执行异步操作。”好的,我会记住这一点,但这里的数据可以在以后传递。“如果您有来自不同用户的多个请求,则使用本地服务器文件是非常糟糕的。”是的,我想我需要创建一些随机文件名。最后一句呢?@Thave1957:那么你必须寻找你的Web服务器如何做异步工作来服务请求(根据异步结果推迟对用户的响应)