我正在尝试编写一个程序,该程序可以解压缩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);
     });
}

09-17 15:33
查看更多