[英]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.