Angular Promises 顺序循环
Angular Promises Sequential loop
我有如下一组数据。
$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) 按 material 分组的订单。在处理完该特定 material 的所有订单后,我想调用另一个函数 (material运行) 来执行 material 运行。在此函数成功后,必须处理下一个 material(及其相应的订单)等。所有这些调用必须是顺序的,因为后端无法并行处理所有内容。
所以我正在寻找这样的东西:
material 答:订单 1 -> 订单 2 -> 订单 3 -> material运行
当 A 的 material运行 完成后,开始 material B
material B: 订单 1 -> 订单 2 -> 订单 3 -> material运行
当 B 的 material运行 完成后,开始 material C
...
我还需要每个 createOrder 的结果来更新订单列表
我目前正在使用 angular promises,但我愿意接受建议。
我希望这 fiddle 对您有所帮助:http://jsfiddle.net/a1sp0ye2/
以下是具有异步主体的循环模板,即下一次迭代必须仅在异步任务完成时发生。它适用于 Angular 上下文中的承诺,但可以推广到我认为的任何承诺实现:
/**
* 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 是您案例的粗略实现(查看浏览器控制台的输出)。
我不确定是否能帮到你,但请尝试使用我的代码: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;
[= 的值相匹配16=]
我有如下一组数据。
$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) 按 material 分组的订单。在处理完该特定 material 的所有订单后,我想调用另一个函数 (material运行) 来执行 material 运行。在此函数成功后,必须处理下一个 material(及其相应的订单)等。所有这些调用必须是顺序的,因为后端无法并行处理所有内容。
所以我正在寻找这样的东西:
material 答:订单 1 -> 订单 2 -> 订单 3 -> material运行
当 A 的 material运行 完成后,开始 material B
material B: 订单 1 -> 订单 2 -> 订单 3 -> material运行
当 B 的 material运行 完成后,开始 material C
...
我还需要每个 createOrder 的结果来更新订单列表
我目前正在使用 angular promises,但我愿意接受建议。 我希望这 fiddle 对您有所帮助:http://jsfiddle.net/a1sp0ye2/
以下是具有异步主体的循环模板,即下一次迭代必须仅在异步任务完成时发生。它适用于 Angular 上下文中的承诺,但可以推广到我认为的任何承诺实现:
/**
* 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 是您案例的粗略实现(查看浏览器控制台的输出)。
我不确定是否能帮到你,但请尝试使用我的代码: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;
[= 的值相匹配16=]