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=]