因此,我要完成的工作基本上是:使用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
}
答案 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);
});
}