【问题标题】:Angular Promises Sequential loopAngular Promises 顺序循环
【发布时间】:2015-04-22 12:11:35
【问题描述】:

我有以下一组数据。

 $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 Promise,但我愿意接受建议。 我希望这个小提琴有帮助:http://jsfiddle.net/a1sp0ye2/

【问题讨论】:

  • 添加您尝试的邮政编码,而不仅仅是链接到小提琴。
  • 那么你期望的输出是什么?
  • "所有这些调用都必须是顺序的,因为后端无法并行处理所有内容。" - 嗯,你知道,也许你应该修复后端?至少如果您可以将所有更新放在一个请求中,并让后端弄清楚如何处理它,那将是合理的。
  • @Grundy 表格更新了正确的订单号,当订单成功处理后,我还会添加更多反馈。就像表格行上的背景颜色或类似的东西
  • @Stvenoo 正确的订单号您如何检测正确的号?

标签: javascript angularjs promise angular-promise


【解决方案1】:

以下是具有异步主体的循环的模板,即下一次迭代必须仅在异步任务完成时进行。它适用于 Angular 上下文中的 Promise,但可以推广到我认为的任何 Promise 实现:

/**
 * 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 是您案例的粗略实现(观察浏览器控制台的输出)。

【讨论】:

    【解决方案2】:

    我不确定这是否可以帮助您,但请尝试使用我的代码: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; 的值匹配

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2020-10-04
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多