javascript - 如何在 Node.js 函数中应用 Promise

标签 javascript node.js asynchronous promise

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

相关文章:

javascript - Jquery 表单验证

javascript - 鼠标悬停消息显示在图像的某些部分 jquery/js

javascript - 下拉菜单添加具有相应 ID 和标签的输入字段

c# - 从 C# 中的异步方法更正匿名对象任务的返回类型

angularjs - 带有进度/通知的服务器异步请求

javascript - 使用 lodash 进行管道过滤和处理

javascript - 引用错误 : json is not defined when AJAX call the server method

javascript - Express Node 如何避免在每次请求时发送用户数据?

javascript - 在 Express.js 中使用 next() 将变量传递给下一个中间件

javascript - 在 if 语句上使用 Promises