Задать вопрос
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.
Что Вы можете подсказать мне?
  • Вопрос задан
  • 5496 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы