我正在尝试编写一个程序,可以解压缩 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”将对这些图片应用灰度。我知道这是因为两个函数同时运行导致了问题。那么我如何实现 promise 来解决这个问题。我知道我可以使用“同步”版本的功能。我只是想知道如何在 promise 中做到这一点。
最佳答案
官方文档中有关于“promisify”的示例:
https://nodejs.org/dist/latest-v12.x/docs/api/util.html#util_util_promisify_original
这将为您提供同一函数的“ promise ”版本(只要原始函数具有标准签名/自定义 promise 定义)。
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);
});
}
关于javascript - 如何在 Node.js 函数中应用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58949291/