javascript - 在回调上运行循环,node js

标签 javascript node.js asynchronous

我需要调整一些图像的大小。问题是我正在使用的库每次回调都会调整一次大小。

我想调整多个图像的大小,因此将其放入循环中:

exports.resizeImages = function (req, res) {
    var images = fs.readdirSync('uploads/');

    for (var n = 0; n < files.length; n++) {
        var tgt = 'uploads/resized/' + images[n];

        gm(tgt).resize(150).write(tgt, function (err) {
            if (err) {
                console.log('resizing failed');
                res.status(400).send('failed to resize');
                return;
            }
            if (n == images.length) {

                res.status(200).send();
            }
        });
    }
}

我知道我不能这样做。我需要让循环等待,直到回调以某种方式响应。我看过一些例子,但我无法让它发挥作用。

有什么想法吗?

最佳答案

您还可以使用node async模块

类似这样的事情:

var async = require('async');

exports.resizeImages = function (req, res) {
    var images = fs.readdirSync('uploads/');

    async.each(images, function(file, callback) {
        var tgt = 'uploads/resized/' + file;
        gm(tgt).resize(150).write(tgt, callback);
    }, function(err) {
        if(err) {
            console.log('resizing failed');
            return res.status(400).send('failed to resize');
        } else {
            //no error
            return res.status(200).send();
        }
    });
}

关于javascript - 在回调上运行循环,node js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30713041/

相关文章:

mysql - 从 Node.js 将 Json 存储到 MySQL 数据库中

javascript - 更改 Socket.IO 静态文件服务路径

javascript - 具有非 jQuery/框架构建的路点

javascript - 如何将 SC.Record 的 SC.Record.toMany() 数据绑定(bind)到 ListView?

javascript - Node.JS + Passport.SocketIO : Edit And Save `socket.handshake.user` Properties

java - Apache HttpComponents 5 : POST form data with HttpAsyncClient

javascript - 当收到多个异步获取响应时,您如何选择您想要的响应(即用户请求的响应)?

javascript - 代码完成——Aptana Eclipse 插件

javascript - 使用 SetTimeout javascript 重复 Ajax 调用,意外执行

c# - 线程与等待任务之间的通信