Вызов Angularjs-Service итеративно
-
21-12-2019 - |
Вопрос
У меня есть массив идентификаторов и хотел бы повторить их и передавать их на сервис, чтобы получить некоторые данные.Но я хотел бы перейти только к следующему идентификатору после завершения обработки предыдущего идентификатора.После того, как все данные были выделены, мне нужно позвонить в определенную функцию.
Мой код (без итерации) Wold - что-то вроде
MyService.fetch(id)
.success(function (data, status, headers, config) {
doSomething();
});
.
Что я хочу достичь, это что-то подобное, но таким образом, что может справиться с неизвестным количеством элементов в моем массиве IDS:
MyService.fetch(id).success(function (data, status, headers, config)
{
MyService.fetch(id2).success(function (data, status, headers, config)
{
doSomething();
});
});
.
Есть идеи, как это достичь?
Спасибо
Томас
Решение
Угловой поставляется с библиотекой Lite Promacy: $ q . Это на самом деле довольно просто сделать.
<Сильная> Сервис
myApp.factory('theProcessor', function($q, $timeout) {
return {
fetch: function(queue, results, defer) {
defer = defer || $q.defer();
var self = this;
// Continue fetching if we still have ids left
if(queue.length) {
var id = queue.shift();
// Replace this with your http call
$timeout(function() {
// Don't forget to call d.resolve, if you add logic here
// that decides not to continue the process loop.
self.fetch(queue, results, defer);
results.push({ id: id, value: Math.floor((Math.random()*100)+1) });
}, 500);
} else {
// We're done -- inform our caller
defer.resolve(results);
}
// Return the promise which we will resolve when we're done
return defer.promise;
},
};
});
.
Увидеть его в действии в Этот пункт .
Другие советы
Попробуйте использовать следующий подход:
var idsArray= [], result = [];
/// ...After filling array
function nextIteration(index) {
MyService.fetch(idsArray[index]).success(function (data, status, headers, config)
{
result.push(data);
if (++index < idsArray.length) {
nextIteration(index)
} else {
console.log('Task complete');
}
}
nextIteration(0);
. Вы можете использовать метод $q
all()
для соединения всех обещаний, которые вы определяете, а затем сделаете что-то после
$q.all([promise1, promise2, ...]).then(...)
.
Вы можете рассмотреть возможность реализации этой функции в вашем контроллере или на вашем сервисе.
Посмотрите на Здесь для полной ссылки на API и детали.
.<Сильное> Обновление
Просто думать, что ваш сервис может принять массив идентификаторов и может иметь метод, который будет рекурсивно получать данные, чтобы вы хотите.Посмотрите и следующий код, это идея, поэтому она может не работать так:
function(){
var result = [];
var fetch = function(idArr /*this is your ID array*/){
(a simple guess if what you want to do with that ID)
$http.get('yourURL?id=' + <first element of idArr>)
.success(function(data){
//some logic
result.push(data);
idArr.splice(1,0);
fetch(idArr);
});
}
}
.