Я новичок в 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);
});
};
Использование $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
клиенту.