Javascript NodeJS Plotly-如何在继续之前等待getImage完成
因此,我试图完成的基本任务是:使用NodeJS和plotly为NodeJS生成一个绘图,并将其放入我的文件系统(使用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
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);
});
}