Angular承诺顺序循环

3
我有一组数据如下。
 $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的结果来更新订单列表
目前,我正在使用Angular promises,但我也愿意接受建议。
我希望这个fiddle能够提供帮助:http://jsfiddle.net/a1sp0ye2/

1
在帖子中添加你尝试的代码,而不仅仅是链接到fiddle。 - Grundy
你期望的输出是什么? - Grundy
1
所有这些调用都必须是连续的,因为后端无法并行处理所有内容。 - 呃,你知道吗,也许你应该修复后端?如果您可以将所有更新放入一个请求中,并让后端想办法处理它,那么至少是合理的。 - Bergi
@Grundy表格已经更新为正确的订单号,当订单成功处理时,我还会添加更多反馈。例如在表格行上添加背景颜色等。 - Stvenoo
@Stvenoo 如何检测“正确”的数字顺序? - Grundy
@Grundy,createOrder函数将返回正确的订单号并替换虚拟值。 - Stvenoo
2个回答

2
以下是异步体循环的模板,即仅当异步任务完成后才进行下一次迭代。它适用于 Angular 上下文中的 promises,但我认为可以推广到任何 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);
    }
}

基于此,这里有一个粗糙的实现你的情况的例子(请注意浏览器控制台的输出)。

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;中的值匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接