MaxSter
@MaxSter
Software engineer

Как вернуть значение из callback функции?

Есть репозиторий, возвращающий из mongo db коллекцию
getProducts: function (callback) {
        products.products.find({}, function (error, result) {
            callback(error, result);
        })
    },

Этот метод используется в другом файле для получения коллекции (пример условный)
getAllProducts: function() {
        var collection;
        productRepository.getProducts(function(error, result) {
            collection = result;
        });
        return collection;
    }

Конечно же, collection вне зоны видимости в callback функции, поэтому return collection возвращает undefined.
Что Вы можете подсказать мне?
  • Вопрос задан
  • 5454 просмотра
Решения вопроса 1
@vsvladimir
Тут идея в том, что функция productRepository.getProducts выполнится мгновенно, а callback функция выполнится через некоторое время. Сначала выполнится productRepository.getProducts, затем return collection, а потом только через некоторое время callback с collection = result, но будет уже поздно.

Дальше уже решать как лучше. Можно асинхронно через callback (callback вместо return):

getAllProducts: function(callback) {        
        productRepository.getProducts(function(error, result) {
            callback(error, result);
        });        
    }


Можно асинхронно через promise. Возможно можно и синхронно (не проверял) - ждать перед return collection выполнения callback - но это будет программу в этот момент тормозить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
haiku
@haiku
Могу подсказать, что, вероятнотно, вы не понимаете что такое асинхронность.
Ф-я getAllProducts должна либо принимать свой колбек, на который затем будет вброшено полученое из монги значение, либо отдавать промис, дифер которого будет резолвиться после collection = result.
Ответ написан
Комментировать
trueClearThinker
@trueClearThinker
Таким образом ничего не получится. Ваш сollection всегда будет undefined. Могу предложить использовать promises.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы