javascript中的局部变量和回调函数

时间:2017-08-28 11:42:32

标签: javascript mongodb gridfs

我已经阅读了this post,但问题不在于我。我正在编写mongoDB GridFS管理所需的功能。我遇到了一种非常奇怪的行为,我将向您展示一个简单的例子。如您所知,我们使用了很多回调函数。在我的简化示例中,一切正常。问题是我想用来自回调函数的值更新局部变量:

function secondFunction(input, callbackFunction) {
    var result = input + 5;
    callbackFunction(result);
}

function thirdFunction(input, callbackFunction) {
    var result = input + 5;
    callbackFunction(result);
}

function mainFunction(input) {
    var Answer = 0;
    secondFunction(input, function (result) {
        thirdFunction(result, function (result) {
            Answer = result;
        })
    });
    console.log(Answer);
}

mainFunction(5);

您期望的结果是15. 答案全局变量已成功更新。但我的问题是下面的代码似乎没有改变局部变量。在这个例子中,我想从gridFS逐个获取我的图像并将它们推入一个名为 images 的数组(局部变量):

function getAll(callback) {
    var images = [];
    db.collection('fs.files').find({}).toArray(function (err, files) {
        var Files = files;
        for (var i = 0; i < Files.length; i++) {
            getFileById(Files[i]._id, function (err, img) {
                if (err) {
                    callback(err, null);
                }
                else images.push(img);
            })
        }
    });
    console.log(images);
}

结果是[]数组。我犯了什么错误?

编辑:

function getFileById(id, callback) {
gfs.createReadStream({_id: id},
    function (err, readStream) {
        if (err) callback(err, null);
        else {
            if (readStream) {
                var data = [];
                readStream.on('data', function (chunk) {
                    data.push(chunk);
                });
                readStream.on('end', function () {
                    data = Buffer.concat(data);
                    var img = 'data:image/png;base64,' + Buffer(data).toString('base64');

                    setTimeout(function () {
                        callback(null, img);
                    }, 2000);

                })
            }
        }
    });
}

function getAll(callback) {
    var images = [];
    db.collection('fs.files').find({}).toArray(function (err, files) {
        var Files = files;
        for (var i = 0; i < Files.length; i++) {
            getFileById(Files[i]._id, function (err, img) {
                if (err) {
                    callback(err, null);
                }
                else images.push(img);
            })
        }
    });
    console.log(images);
}

1 个答案:

答案 0 :(得分:0)

如果将console.log("inside")放入forloop怎么办?我想你的console.log(images)

在循环开始之前渲染