【问题标题】:Flattening nested promises in AngularJS [duplicate]扁平化AngularJS中的嵌套承诺[重复]
【发布时间】:2015-02-05 19:45:30
【问题描述】:

有没有办法将一个承诺的返回值沿链传递给下一个而不是下一个?目前,我们通常嵌套 promise 以将值保留在函数范围内,如下所示:


return getOrder()
    .then(function (order) {
        return getOrderlines(order)
            .then(function (orderLines) {               
                //do something with order and orderlines
                processOrderAndOrderlines(order, orderLines);
            });
    })
    .then(function () { //do something else
    });

是否有可能以某种方式将订单对象传递到承诺链中以获得类似于:

return getOrder()
    .then(function (order) {
        return getOrderlines(order);            
    })
    .then(function (orderLines) {               
        //do something with order and orderlines
        processOrderAndOrderlines(order, orderLines);
    });
    .then(function () { //do something else
    });

【问题讨论】:

  • 只需在getOrderLines() 中返回order(或orderLines)(而不是你现在正在做的承诺?)并将其作为参数传递给关注.then()。跨度>
  • @zvona 这意味着我需要预测其他调用者可能需要从该函数中获得什么 - 我通常不会从名为 getOrderLines 的函数中返回订单。
  • @AnilSingh 不幸的是,这些答案并没有解决在前一个之前保持对承诺结果的访问权的问题(在我的示例中为 order)。

标签: javascript angularjs promise angular-promise


【解决方案1】:

您可以在外部范围定义一个变量并将其设置在 promise 内部:

var order, orderLines;

return getOrder()
    .then(function (result) {
        order = result;
        return getOrderlines(order);            
    })
    .then(function (result) {               
        //do something with order and orderlines
        orderLines = result;
        processOrderAndOrderlines(order, orderLines);
    });
    .then(function (result) { //do something else

    });

【讨论】:

  • 这当然可以。不过,我想知道是否有没有其他变量的解决方案。在我接受这个答案之前,让我等待一段时间的不同答案。
【解决方案2】:

如果您需要在processOrderAndOrderlines 中同时使用orderLines 和初始order 对象,那么最简洁的方法是使用某种映射来解析getOrderlines promise,其中也包括order 对象。比如这样:

function getOrderLines(order) {
    // Some promise flow, e.g.:
    return $http.post('getOrderLines', {order: order}).then(function(response) {
        return {
            order: order,
            orderLines: response.data
        }
    });
}

那么你就可以这样使用它了:

return getOrder()
   .then(function (order) {
       return getOrderlines(order);
   })
   .then(function (data) {
       return processOrderAndOrderlines(data.order, data.orderLines);
   })
   .then(function (result) {
      console.log(result)
   });

【讨论】:

  • 这里的问题是,在 getOrderLines 的一种用法中,我可能有兴趣将订单作为“数据”的一部分,但在其他情况下,它可能是别的东西。这限制了该函数的可重用性。我想我可以让所有函数都接受一个额外的参数数组,这些参数只是添加到结果数组中,但这似乎有点矫枉过正。
猜你喜欢
  • 2017-03-19
  • 1970-01-01
  • 2018-01-31
  • 2015-04-11
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2017-11-27
  • 2014-08-12
相关资源
最近更新 更多