我已经阅读了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);
}
答案 0 :(得分:0)
如果将console.log("inside")
放入forloop怎么办?我想你的console.log(images)
在循环开始之前渲染