NodeJS Plotly-如何等待getImage完成之后再继续

时间:2019-10-29 22:02:52

标签: javascript node.js plotly

因此,我要完成的工作基本上是:使用NodeJS生成一个图,并为NodeJS绘制图,然后将其放入我的文件系统(使用getImage),然后再处理图像。我的问题是,该函数在完成并将图像放入文件系统之前返回。因此,我的结果基本上是,在调用generate_plot()之后,该文件尚不存在,并且出现错误。现在,我的问题是:我如何等待generate_plot()完成并将图像放入文件系统,然后继续并使用该图像/使用该图像?

const fs = require("fs");
var plotly = require('plotly')(username, api_key);

function generate_plot(){
    var trace = {
      type: 'bar',
      x: ['Mario', 'Luigi', 'Bowser'],
      y: [50000, 10000, 2000],
      marker: {color: ["red", "green", "darkblue"]},
    };

    var layout = {
      plot_bgcolor: 'rgb(52, 54, 60)',
      paper_bgcolor: 'rgb(52, 54, 60)',
    };

    var chart = {data: [trace], layout: layout};

    var pngOptions = {format: 'png', width: 1000, height: 500};

    plotly.getImage(chart, pngOptions, function (err, imageData) {
        if (err) throw err
        var pngStream = fs.createWriteStream('test.png');
        imageData.pipe(pngStream);
    })
}

function run(){
    generate_plot()
    // proceed with the generated plot which should be in the filesystem
}

1 个答案:

答案 0 :(得分:0)

欢迎堆栈溢出!

我删除了以前的答案,因为(如您正确指出的那样)它们不能解决全部问题。

generate_plot()函数之外返回控制之前,需要完成两个异步任务:从Plotly检索数据,并将该内容写入磁盘。

下面的示例调用generate_plot(),然后(作为验证文件是否确实在磁盘上的测试),它立即将test.png复制到test2.png。因为这会导致两个文件的大小相同,所以这表明fs.copyFileSync直到磁盘上的test.png文件都没有运行。

我确实稍微更改了一些变量名,但这现在应该可以工作。

为等待文件流完成,请参考以下问题:event associated with fs.createWriteStream in node.js

function generate_plot() {
  return new Promise((resolve, reject) => {
    var trace = {
      type: 'bar',
      x: ['Mario', 'Luigi', 'Bowser'],
      y: [50000, 10000, 2000],
      marker: { color: ["red", "green", "darkblue"] },
    };

    var layout = {
      plot_bgcolor: 'rgb(52, 54, 60)',
      paper_bgcolor: 'rgb(52, 54, 60)',
    };

    var chart = { data: [trace], layout: layout };

    var pngOptions = { format: 'png', width: 1000, height: 500 };

    plotly.getImage(chart, pngOptions, (err, imageStream) => {
      if ( err ) return reject(err);
      var fileStream = fs.createWriteStream('test.png');
      imageStream.pipe(fileStream);
      fileStream.on('error', reject);
      fileStream.on('finish', resolve);
    });
  });
}

function run() {
  generate_plot()
    .then(() => {
      fs.copyFileSync('test.png', 'test2.png');
      console.log('done');
    })
    .catch(err => {
      console.log(err);
    });
}