Возвращение обратного вызова в Javascript - PullRequest
0 голосов
/ 28 сентября 2018

Вдохновившись этим ответом https://stackoverflow.com/a/21571589/9036255 Я решил скопировать это в свой собственный код.Я обнаружил, что он не дает никакого ответа.

function getCallback(callbackTrash) {
    var Books = mongoose.model('Book');
    Books.find({'username': name[usernames]}, function (err, result) {
        callbackTrash(result);
    });
}

getCallback(function(result) {
    books.push(result);
});

books - это просто массив.Когда я позже сохраняю консоль, он возвращает «[]»

Если я изменяю books.push на console.log, он корректно регистрирует все результаты.

Мой вопрос заключается в том, какполучить результат для добавления в массив книг?

У меня нет опыта работы с асинхронными вещами.Какой практический ответ без крутой кривой обучения?


Вот мой более широкий контекст:

exports.timeline = function(req, res) {
    var Followers = mongoose.model('Follow');
    Followers.find({'follower': req.user.username}, function(err, followerResult) {
        var name = [req.user.username];
        var books = [];

        function addName(username) {
            name.push(username);
        }

        for(var user in followerResult) {
            addName(followerResult[user]['followed']);
        }

        for(var usernames in name) {
            function getCallback(callbackTrash) {
                var Books = mongoose.model('Book');
                Books.find({'username': name[usernames]}, function (err, loadOfBollocks) {
                    callbackTrash(loadOfBollocks);
                });
            }

            getCallback(function(result) {
                books.push(result);
            });
        }

        console.log(books);
        res.send(books);
    });
}

1 Ответ

0 голосов
/ 28 сентября 2018

Я думаю, что ваш код правильный.Но:

  • где вы инициализировали "книги"?
  • Где вы записали это в журнал?

РЕДАКТИРОВАТЬ

Хорошо, теперь я вижу.Вы кладете консоль и отправляете в неправильном месте.Эти строки выполняются до завершения вашего цикла (for). Поэтому у вас есть пустой массив для «books».Возможно, вам нужно выполнять эти коды только после завершения цикла в массиве «name».Вот код:

exports.timeline = function(req, res) {
    var Followers = mongoose.model('Follow');
    Followers.find({'follower': req.user.username}, function(err, followerResult) {
        var name = [req.user.username];
        var books = [];

        function addName(username) {
            name.push(username);
        }

        for(var user in followerResult) {
            addName(followerResult[user]['followed']);
        }

        let count = 0;
        for(var usernames in name) {
            function getCallback(callbackTrash) {
                var Books = mongoose.model('Book');
                Books.find({'username': name[usernames]}, function (err, loadOfBollocks) {
                    count++;
                    callbackTrash(loadOfBollocks);
                    if(count == name.length){
                        console.log(books);
                        res.send(books);
                    }
                });
            }

            getCallback(function(result) {
                books.push(result);
            });
        }
    });
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...