@vostotskiy

Что я делаю не так с promise в сервисе AngularJS?

Здравствуйте. Перенес с контроллера логику загрузки данных в отдельный сервис. в контроллере вызываю
vm.projects= reportsService.initReport( vm.id);
В самом методе initReport такой код
function initReport(id) {
    getTimeTypes(isView).then(function(data){
        types = data;
    })
    console.log(types);
    return [
        types
    ]
}


Функция для получения типов обрабатывает http-запрос и возвращает ошибку или данные
function getTimeTypes(isView){
            return restAPI.getTimeTypes()
                .then(
                    function( data ) {
                        var temp = [];
                        temp = parseResponse(data,isView);
                        if(temp.items && temp.items.length){
                            return temp.items;
                        }
                    }
                )
        }

В моем случае получается, что в initReport возвращается пустая переменная types (срабатывает return, пропуская инициализацию в then types), не дожидаясь, пока сработает этот блок в методе
getTimeTypes(isView).then(function(data){
    types = data;
})

Подскажите, пожалуйста, почему игнорируется данный фрагмент кода, невзирая на наличие в нем then блока ожидания асинхронной операции и почему функция возвращает результат раньше выполнения одной из команд. Спасибо.
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ответы на вопрос 2
Подскажите, пожалуйста, почему игнонируеться данный фрагмент кода, невзирая на наличие в нем then блока ожидания асинхронной операции и почему функция возвращает результат раньше выполнения одной из команд.

Потому что это и есть асинхронность. То, что вы описываете - это синхронный код, у вас его нет, поэтому нет и поведения, которое вы ожидаете.
Всё, что вы можете вернуть из асинхронной функции - промис. И далее по коду подписаться на его выполнение при помощи .then().

function initReport(id) {
    getTimeTypes(isView).then(function(data){
        return [data];
    });
}

initReport(42).then(function (types) {
  console.log(types);
});
Ответ написан
Ваш ответ на вопрос

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

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