for循环{j}中的异步行为

时间:2017-09-02 12:35:23

标签: javascript mongodb asynchronous gridfs

首先,我接受这个问题对开发人员来说不是什么新问题,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秒,但一般情况下你永远不知道。)

处理这类行为的最佳方式是什么,因为它们如此常见?

0 个答案:

没有答案