Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

请问如何返回异步执行后的结果?

$
0
0

不知道标题表述是否正确,我想实现一个hexo博客的功能:自动将博客中图片宽度过大的图片进行裁剪,并将博文中的html标签进行替换。下面是我的代码:

var sharp = require("sharp");
var path = require("path");

hexo.extend.filter.register('after_post_render', function(data) {

    data.content = data.content.replace(/<p>(<img src="([^"]+)"[^>]*alt="([^"]+)"[^>]*>)<\/p>/g, function (string, imgtag, imgsrc, imgalt) {

        var inPath = path.join(
            hexo.source_dir,
            imgsrc
        );

        var outSRC = path.join(
            path.dirname(imgsrc),
            "thumb_" + path.basename(imgsrc)
        );

        var outPath = path.join(
            hexo.source_dir,
            outSRC
        );

        // 这是一个异步操作?
        sharp(inPath).metadata(function (err, metadata) {
            if (metadata.width > 800) {

                sharp(inPath)
                .resize(768, 432)
                .min()
                .withoutEnlargement(true)
                .toFile(outPath, function(err) {
                    if (err) {
                        console.log("IMGERR: " + err);
                    } else{
                        imgtag = '<a href="' + imgsrc + '"><img src="' + outSRC + '" alt="' + imgalt + '"><span class="image-caption">' + imgalt + '</span></a>';
                    };
                });

            };
        });

        console.log("IMGERR: " + imgtag);
        return imgtag; // 问题是这里return的imgtag不会变
    });

    return data;
});

问题是,由于使用sharp这个包,处理图片是异步操作,最终对于要替换的字符串,我将imgtag改变后想返回用于替换,然而一直是返回的都是未改变的imgtag值。

我对js不太了解,麻烦各位帮我看看如何修改。谢谢!

附sharp这个包的文档地址:http://sharp.dimens.io/en/stable/api-input/


Viewing all articles
Browse latest Browse all 14821

Trending Articles