Угловая функция вернула обещание до завершения http api

0

Я новичок в AngularJs. У меня есть одна функция проверки, которая возвращает обещание. эта функция внутренне вызывает http get api и получает ответ от ответа. У меня есть код проверки, который требует ответа от вызываемого api. но прежде чем HTTP-вызов завершится и функция получит ответ от api, функция validate вернет обещание вызывающему. который вызывает подтверждение. кто-то может поделиться некоторым кодом, который удовлетворяет этому требованию.

function validateDates(delegate) {      
    var currStartDate = delegate.start_date;
    var currEndDate = delegate.end_date;
    var overlap = false;
    var deferred = $q.defer();

    UserDelegateService.getDelegateForUser(delegate.comit_id).then(
        function(res) {
            for(var i = 0; i<res.length; i++) {
                    var sDate = $filter('date')(res[i].start_date, 'yyyy-MM-dd');
                    var eDate = $filter('date')(res[i].end_date, 'yyyy-MM-dd');
                    if(currStartDate <= eDate && sDate <= currEndDate) {
                        overlap = true;         
                        deferred.resolve(overlap);                          
                    } else
                        deferred.reject("Not overlapping"); 
                }
        },
        function(errorresponse) {
            console.log(errorresponse);
        });
    return deferred.promise;
};

код вызова:

$scope.saveDelegate = function() {
    var delegate = {
            //assign values ... 
    };

    var promise = validateDates(delegate);
    promise.then(function(data) {   
        if(data) {
            console.log('Dates are overlapping....if part.......', data);
        }
    }, function(reason) {
            console.log('Dates are not overlapping..saving datlegate..else part.........', reason);
            $scope.save(delegate);
    });
};
  • 1
    Можете ли вы поделиться тем, что вы сделали до сих пор?
  • 0
    Обновил пост. Спасибо!
Показать ещё 4 комментария
Теги:

1 ответ

0
Лучший ответ

Использование $q.defer прерывает цепочку обещаний и теряет информацию об ошибках. Также было принято решение о решении/отказе в первом элементе цикла for.

Вместо этого возвращайте значения и цепочку.

function validateDates(delegate) {      
    var currStartDate = delegate.start_date;
    var currEndDate = delegate.end_date;
    //var overlap = false;
    //var deferred = $q.defer();

    var p = UserDelegateService.getDelegateForUser(delegate.comit_id);
    var derivedPromise = p.then(
        function onSuccess(res) {
            //Initialize overlap var in success handler
            var overlap = false; 
            for(var i = 0; i<res.length; i++) {
                var sDate = $filter('date')(res[i].start_date, 'yyyy-MM-dd');
                var eDate = $filter('date')(res[i].end_date, 'yyyy-MM-dd');
                if(currStartDate <= eDate && sDate <= currEndDate) {
                     overlap = true;         
                };
            //Return value of overlap for chaining
            return overlap;
        });
    };
    //return derived promise
    return derivedPromise;
};

Вышеупомянутая функция возвращает обещание, которое разрешает true если какая-либо из дат перекрывается и разрешает false если ни одна из дат не перекрывается.

Код клиента:

$scope.saveDelegate = function() {
    var delegate = {
            //assign values ... 
    };

    var promise = validateDates(delegate);
    promise.then(function onSuccess(overlap) {   
        if(overlap) {
            console.log('Dates are overlapping....if part.......', overlap);
        } else {
            console.log('Dates are not overlapping..saving datlegate..');
            $scope.save(delegate);
        };
    }).catch(function onReject(reason) {
        console.log("Promise rejected for another reason");
    });
};

Возвращаясь и связывая обещания, любая ошибка в операции getDelegateForUser клиенту.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню