我有一个id数组,并希望迭代它们并将它们传递给服务以获取一些数据。但是我想在前一个id处理完成后才转到下一个id。获取完所有数据后,我需要调用一个特定的函数。
我的代码(没有迭代)会像
MyService.fetch(id)
.success(function (data, status, headers, config) {
doSomething();
});
我想要实现的是这样的东西,但是能够处理我的id数组中未知数量的项目:
MyService.fetch(id).success(function (data, status, headers, config)
{
MyService.fetch(id2).success(function (data, status, headers, config)
{
doSomething();
});
});
任何想法如何实现这一目标?
感谢
托马斯
答案 0 :(得分:3)
Angular附带一个精简版承诺库:$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;
},
};
});
在this plunker看到它的实际效果。
答案 1 :(得分:2)
尝试使用以下方法:
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);
答案 2 :(得分:1)
您可以使用$q
的{{1}}方法捆绑您定义的所有承诺,然后在解析所有之后执行某些操作,例如:
all()
您可能需要考虑在控制器或服务中实施此功能。
请查看HERE以获取完整的API参考和详细信息。
<强>更新强>
只是认为你的服务可以接受一组id,它可能有一个方法可以按你想要的方式递归地获取数据。看看和下面的代码,这是一个想法,所以它可能无法正常工作:
$q.all([promise1, promise2, ...]).then(...)