如何解决如何使node.js程序等待PNG解析?
我正在编写一个项目,要求我加载很多低分辨率PNG(〜10k)来训练我的神经网络。这是我的代码
注意:该项目使用“ pngjs”模块
for(var i = 0;i < 100;i++){
var input_dir = dirs[i];
console.log('file number: ',i);
fs.createReadStream(input_dir).pipe(new PNG({
filterType: 4,}))
.on("parsed",function(){
console.log(input_dir);
for(var y = 0; y < this.height; y++) {
for (var x = 0; x < this.width; x++) {
var idx = (this.width * y + x) << 2;
// invert color
this.data[idx] = 255 - this.data[idx];
this.data[idx + 1] = 255 - this.data[idx + 1];
this.data[idx + 2] = 255 - this.data[idx + 2];
var sum = this.data[idx]+this.data[idx + 1]+this.data[idx + 2];
sum /= 3;
arr.push(sum);
}
}
console.log(arr);
});
}
执行后,在终端中输入了大量的file number:
,然后显示了所有图像。
有什么方法可以让程序等待图像解析?
解决方法
createReadStream每次调用时都会异步运行,您可以将其包装在一个返回承诺的函数中,然后通过Promise.all等待这些承诺中的每一个。
function readStreamPromise(input_dir){
return new Promise((resolve) => {
fs.createReadStream(input_dir)
.pipe(new PNG({filterType: 4,}))
.on("parsed",() => {
// do parsing logic
resolve()
});
}
}
然后做类似的事情
await Promise.all(dirs.map((inputDir) => {
return readStreamPromise(inputDir)
})
当然,如果使用await,则需要将其包含在异步函数中
,我想您想先等待其加载阶段,然后再继续。幸运的是有一个关键字。即await
。它必须与async
配对。看看。
编辑:通常的想法是,您将制作一系列所谓的Promises(与异步和等待有关);每个图片一个承诺。然后,您可以等待所有这些异步承诺的完成,即,当所有图像加载时。之后,您可以在仍要事先异步加载所有图像的同时执行所需的操作。 (提示:Promise.all)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。