我正在尝试编写一个程序,该程序可以解压缩zip文件,读取文件中的图像并对其应用灰度。
现在我有这两个功能:
var fs = require('fs'),
PNG = require('pngjs').PNG
const unzipper = require('unzipper')
PNG = require('pngjs').PNG
const dir = __dirname + "/";
const myFile = (fileName) => {
let createdFile = dir + fileName
fs.createReadStream(createdFile)
.pipe(unzipper.Extract({ path: 'myfile' }));
console.log('file unzipped')
}
myFile("myfile.zip")
function applyFilter(Name) {
fs.readdir(Name, 'utf-8', (err, data) => {
if (err) {
console.log(err)
} else {
data.forEach(function (file) {
if (file.includes('png')) {
let greyPNG = (__dirname + '/' + 'myfile' + '/' + file)
console.log (greyPNG)
fs.createReadStream(greyPNG)
.pipe(new PNG({
colorType: 0,
}))
.on('parsed', function () {
this.pack().pipe(fs.createWriteStream(__dirname + "/" + "myfile" + "/" + file));
});
}
})
}
})
}
applyFilter ('myfile')
这两个函数分别可以正常工作,但是,如果我注释掉“ applyFilter”,它将无法一起运行。一个zip文件将被解压缩。如果目录中有文件,则“ applyFilter”将在这些图片上应用灰度。我知道这是因为两个函数同时运行会导致问题。因此,我如何实现承诺来解决此问题。我知道我可以使用“同步”版本的功能。我只是想知道如何在诺言中做到这一点。
最佳答案
官方文档中有有关“承诺”的Example的示例:
https://nodejs.org/dist/latest-v12.x/docs/api/util.html#util_util_promisify_original
这将为您提供相同功能的“承诺”版本(只要原始功能具有标准签名/自定义承诺定义)。
const util = require('util');
const fs = require('fs');
const stat = util.promisify(fs.stat);
async function callStat() {
const stats = await stat('.');
console.log(`This directory is owned by ${stats.uid}`);
}
您还可以实现自己的实现,只需返回一个Promise(此示例正在读取http请求):
function read_request(request) {
request.setEncoding("utf-8");
return new Promise((resolve, reject) => {
var cache = "";
request.on("data", (chunk) => {
cache += cache;
}).on("end", () => {
resolve(cache);
}).on("error", reject);
});
}