Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.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
Javascript NodeJS Plotly-如何在继续之前等待getImage完成_Javascript_Node.js_Plotly - Fatal编程技术网

Javascript NodeJS Plotly-如何在继续之前等待getImage完成

Javascript NodeJS Plotly-如何在继续之前等待getImage完成,javascript,node.js,plotly,Javascript,Node.js,Plotly,因此,我试图完成的基本任务是:使用NodeJS和plotly为NodeJS生成一个绘图,并将其放入我的文件系统(使用getImage),然后继续处理映像。我的问题是,函数在完成并将映像放入文件系统之前返回。因此,我的结果基本上是,在调用generate_plot()之后,该文件还不存在,我得到了一个错误。现在我的问题是:如何等待generate_plot()完成,并在继续使用此映像/使用此映像之前将映像放入文件系统 const fs = require("fs"); var plotly = r

因此,我试图完成的基本任务是:使用NodeJS和plotly为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
}

欢迎来到堆栈溢出

我删除了以前的答案,因为(正如你正确指出的)它们没有解决全部问题

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

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

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

为了等待文件流完成,我参考以下问题:


首先,非常感谢你的帮助和回复,这是我一直在寻找的想法。。。出现的小问题是,在
run()
中尝试访问映像时,映像尚未完全就绪。在调用
imageData.pipe()
之后,我添加了一个额外的
setTimeout()
,它正在工作,但我想这并不是最优雅的方式。你知道有更好的方法吗?因为如果我使用你的解决方案,然后继续绘图,图像仍在加载,并且没有完全设置。很抱歉,有两个异步任务需要完成;从Plotly检索内容,并将该内容写入磁盘。上述解决方案只修复了第一个问题。我将修改答案以显示如何等待文件被写入。这确实按照预期工作,谢谢!因此,事实上,“test2.png”只是一个临时文件,用于同步进程,如果我理解正确的话,之后就不需要了?是的,
test2.png
只是验证
test.png
在运行
fs.copyFileSync
函数时是否完全在磁盘上的测试。如果这两个文件的内容相同(对我来说也是如此),那么我们成功地将
generate_plot()
之后的下一个命令从执行推迟到
test.png
完全在磁盘上。换句话说,您可以删除该
fs.copyFileSync
命令,并将其替换为您想用
test.png
执行的操作。
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);
    });
}