我有以下数据集。
$scope.orders = [
{ material: 'A', quantity: 32, orderNumber: 'dummy'},
{ material: 'A', quantity: 65, orderNumber: 'dummy'},
{ material: 'A', quantity: 86, orderNumber: 'dummy'},
{ material: 'B', quantity: 45, orderNumber: 'dummy'},
{ material: 'B', quantity: 68, orderNumber: 'dummy'},
{ material: 'B', quantity: 15, orderNumber: 'dummy'},
{ material: 'C', quantity: 11, orderNumber: 'dummy'}
];
我想处理(createOrder)按材料分组的订单。在处理完该特定材料的所有订单之后,我想调用另一个执行材料运行的函数(materialRun)。在此功能成功之后,必须处理下一个材料(及其相应的订单)等。所有这些调用必须是顺序的,因为后端不能并行处理所有内容。
所以我正在寻找类似的东西:
材料A:订单1 - >订单2 - >订单3 - > materialRun
当完成A的materialRun时,启动材料B
材料B:订单1 - >订单2 - >订单3 - > materialRun
当B的materialRun完成后,启动材料C
...
我还需要每个createOrder的结果来更新订单列表
我现在正在使用有角度的承诺,但我愿意接受建议。 我希望这个小提琴有用:http://jsfiddle.net/a1sp0ye2/
答案 0 :(得分:2)
以下是具有异步主体的循环的模板,即下一次迭代必须仅在异步任务完成时进行。它适用于Angular上下文中的promise,但可以推广到我认为的任何promises实现:
/**
* Loop the items array asynchronously.
*
* @param items - Array to iterate
* @param doLoopBody - Callback that executes the body loop, returns promise
*/
function asyncLoop(items, doLoopBody) {
var i = 0, d = $q.defer();
nextIteration();
return d.promise;
function nextIteration() {
if( i < items.length ) {
doLoopBody(items[i], i, items).then(
function() {
i++;
nextIteration();
},
onError
);
}
else {
d.resolve();
}
}
function onError(reason) {
d.reject(reason);
}
}
基于此,here是您案例的粗略实现(观看浏览器的输出控制台)。
答案 1 :(得分:0)
我不确定这可以帮到你,但尝试使用我的代码:jsfiddle
$scope.promises = [];
ordersByMaterial.forEach(function(order) {
$scope.promises.push(createOrder(order));
});
我尝试通过创建$scope.logsCreateValue = [];
来测试它,其中我保留Math.floor(Math.random() * 10);
的随机值。请参阅console.log($scope.logsCreateValue);
,它应该与来自$scope.orders[key].orderNumber = res[key].orderNumber;