簡體   English   中英

NodeJS Plotly - 如何在繼續之前等待 getImage 完成

[英]NodeJS Plotly - how to wait for getImage to finish before continuing

所以,我想要完成的基本上是:通過使用 NodeJS 和 plotly 生成 plot 並將其放入我的文件系統(使用getImage ),然后繼續處理圖像。 我的問題是,function 在完成並將圖像放入我的文件系統之前返回。 所以我的結果基本上是在我調用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() function 之外返回控制之前需要完成兩個異步任務:從 Plotly 檢索數據,並將該內容寫入磁盤。

下面的示例調用generate_plot() ,然后(作為驗證文件是否真的在磁盤上的測試)它立即將test.png復制到test2.png 因為這會導致兩個文件大小相同,這表明fs.copyFileSync直到test.png文件完全在磁盤上才運行。

我確實稍微更改了一些變量名,但這現在應該可以工作了。

為了等待文件 stream 完成,我參考了這個問題: 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);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM