Angular Promises顺序循环

时间:2015-04-22 12:11:36

标签: javascript angularjs promise angular-promise

我有以下数据集。

 $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/

2 个答案:

答案 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;

的值匹配