Jadi, apa yang saya coba capai pada dasarnya adalah: Membuat plot dengan menggunakan NodeJS dan plotly untuk NodeJS dan memasukkannya ke sistem file saya (dengan getImage), dan melanjutkan dengan gambar sesudahnya. Masalah saya adalah, fungsi itu kembali sebelum menyelesaikan dan memasukkan gambar ke sistem file saya. Jadi hasil saya pada dasarnya adalah setelah saya memanggil generate_plot(), file tersebut belum ada dan saya mendapatkan kesalahan. Sekarang ke pertanyaan saya: Bagaimana saya menunggu generate_plot() selesai dan memasukkan gambar ke sistem file saya sebelum melanjutkan dan menggunakan gambar ini/untuk menggunakan gambar ini?

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
}
0
Jan 30 Oktober 2019, 01:02

1 menjawab

Jawaban Terbaik

Selamat datang di Stack Overflow!

Saya telah menghapus jawaban saya sebelumnya, karena (seperti yang Anda tunjukkan dengan benar) mereka tidak menyelesaikan masalah sepenuhnya.

Ada dua tugas asinkron yang perlu diselesaikan sebelum kita mengembalikan kontrol di luar fungsi generate_plot(): mengambil data dari Plotly, dan menulis konten itu ke disk.

Contoh di bawah memanggil generate_plot(), dan kemudian (sebagai pengujian untuk memvalidasi apakah file tersebut benar-benar ada di disk) segera menyalin test.png ke test2.png. Karena ini menghasilkan kedua file dengan ukuran yang sama, ini menunjukkan bahwa fs.copyFileSync tidak berjalan hingga file test.png sepenuhnya berada di disk.

Saya memang mengubah beberapa nama variabel Anda sedikit, tetapi ini seharusnya berfungsi sekarang.

Untuk menunggu aliran file selesai, saya merujuk pertanyaan ini: acara terkait dengan fs.createWriteStream di 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);
    });
}
0
Jeff Breadner 31 Oktober 2019, 19:51