首先,我接受这个问题对开发人员来说不是什么新问题,Stackoverflow中有数千个帖子。(特别是this post) 我是网络开发的新手。当我读这些帖子时,我不明白他们在说什么。我需要一个非常简单的解决方案,因为我是一个业余爱好者。
如您所知,有时您需要从数据库中检索数据(在我的情况下,它是MongoDB GridFS),有时这会导致问题。
下面的函数( getAll )用于检索我的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);
})
}
});
setTimeout(function () {
callback(null, images);
}, 1000)
}
首先,我没有使用 setTimeout ,并且遇到了我的 images 数组始终为空的问题。但是当我使用 setTimeout 功能时,一切都进展顺利。 (花了将近一周的时间才找到这个解决方案!)
我熟悉承诺以及它们的意思和用法(每当我使用 $ promise 从服务器收到任何答案时,我在AngularJs中都会使用它) 。是否有可能在这里使用承诺之类的东西? 我使用这种方法,但再次不起作用(答案又是一个空数组):
function getAll() {
return new Promise(function (resolve, reject) {
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) {
reject('error occurred');
}
else images.push(img);
})
}
});
resolve(images);
});
}
正如我在这篇文章中提到的,我用 setTimeout 成功处理了这个问题,但我认为这种处理方式是完全错误的,因为我不知道检索过程何时完成(这里我选择延迟1秒,但一般情况下你永远不知道。)
处理这类行为的最佳方式是什么,因为它们如此常见?