【问题标题】:Angular q all dynamic resultsAngular q 所有动态结果
【发布时间】:2014-12-21 07:23:21
【问题描述】:

在做某事之前,我需要等待两个 Promise 解决。问题是,有时我只能根据客户的要求发送一个 Promise,而我需要依靠来自这个 $q 的结果。全部。如何动态定义变量?

  var makePurchaseToResolve = [];

    if( CartService.items.draws.length ) {
      var drawOrder = {};
      drawOrder.price = $scope.getTotal();
      drawOrder.paymentMethodId = $scope.payment.paymetMethodId;
      drawOrder.orderItems = CartService.items.draws;
      drawOrder.payFromBalance = false;
      makePurchaseToResolve.push(DrawService.makePurchase(drawOrder));
    }

    if( CartService.items.hunters.length ) {
      var hunterOrder = {};
      hunterOrder.paymentMethodId = $scope.payment.paymetMethodId;
      hunterOrder.orderItems = CartService.items.hunters;
      makePurchaseToResolve.push(HunterService.makePurchase(hunterOrder));      
    }


$q.all(makePurchaseToResolve).then(function( res ) {
     $q.all([HunterService.getPurchase(res[0].data.data),DrawService.getPurchase(res.data.data)]).then(function() {

            //here is the problem, because i dont know if i have the two promises to resolve or only one

            $scope.hunters = res[0].data.data[0];
            $scope.drawOrder = res[1].data.data;          
          })
}

【问题讨论】:

  • 总是1还是2?
  • 不,以后会更多。我需要它灵活。
  • 是的,这是如何工作的,我需要先下订单,然后取回 id,然后创建新的发布请求以获取订单。

标签: javascript angularjs promise


【解决方案1】:

一个鲜为人知的事实是$q.all 也可以接受一个对象而不是一个数组,这可以在这种情况下简化你的生活:

var purchases = {}; // an object rather than an array for named properties

if( CartService.items.draws.length ) {
  //...
  purchases.drawOrder = DrawService.makePurchase(drawOrder); // named assign
}

if( CartService.items.hunters.length ) {
  //...
  purchases.hunters = HunterService.makePurchase(hunterOrder);      
}

// any more additions to the objects here..

$q.all(purchases).then(function(resolved){
    // resolve anything further you need
    $scope.purchases = resolved; // Add $scope.purchases.hunters etc 
});

promise 在一个对象中解析,因此它们被命名,而不是拥有一个数组,而是得到一个具有属性的解析对象,因此您可以使用 resolve.hunters 或已解决的.drawOrder。这个解决方案只是嵌套到 $scope 一层并自动执行。

【讨论】:

  • resolved 在这种情况下是 makePurchase 的分辨率值 - 我已经从这个解决方案中省略了 getPurchase 调用(将它们放在评论中),因为它们与 想法在这里。您需要将它们添加到您自己的代码中。
  • 是的,但我如何知道哪个承诺已解决并将正确的值分配给正确的 $scope 变量?
  • @JsIsAwesome 因为它们在一个对象中解析,所以它们被命名,而不是拥有一个数组,你得到一个具有属性的解析对象,所以而不是做 arr[0] 这可能是你会乱序做resolved.huntersresolved.drawOrder。这个解决方案只是嵌套到$scope 一层并自动执行。
  • 酷,我在控制台中看到了。那是非常非常有帮助的,谢谢!!
  • @BenjaminGruenbaum,您实际上可以通过$q.all([null, noNullPromise])保留订单
【解决方案2】:

如果你愿意,你也可以保持承诺的顺序,并为那些根据你的条件未应用的承诺传递null

当您的服务从调用者那里获得动态数量的购买请求并且无法选择命名时,这是一种替代方法。

$q.all([null, huntersOrderPromise])
     .then(function(data){
       $scope.drawOrder = data[0]; // will be null
       $scope.hunterOrder = data[1];
     });

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2016-12-28
    • 2012-09-14
    • 2012-01-12
    • 2022-11-25
    • 2014-10-09
    相关资源
    最近更新 更多