Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 所有动态结果的角度q_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript 所有动态结果的角度q

Javascript 所有动态结果的角度q,javascript,angularjs,promise,Javascript,Angularjs,Promise,在做某事之前,我需要等待两个承诺的解决。问题是,有时我只能根据客户的需求发送一个承诺,我需要依靠这$q.all的结果。如何动态定义变量 var makePurchaseToResolve = []; if( CartService.items.draws.length ) { var drawOrder = {}; drawOrder.price = $scope.getTotal(); drawOrder.paymentMethodId = $

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

  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;          
          })
}

一个鲜为人知的事实是,
$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 
});

承诺是在对象中解析的,因此它们被命名,而不是使用数组。您将获得一个具有属性的解析对象,因此,您可以使用resolved.hunters或resolved.drawOrder,而不是执行arr[0],因为arr[0]可能不符合顺序。此解决方案仅嵌套到$scope一级并自动执行

如果愿意,您还可以遵守承诺的顺序,并将未根据您的条件应用的承诺传递给
null

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

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

总是1还是2?不,将来会更多。我需要它是灵活的。是的,这是如何工作的,我需要先下订单,然后获取id,然后创建新的post请求以获取订单。
已解决
在这种情况下是
makePurchase的解决值
-我省略了此解决方案中的
getPurchase
调用(将它们放在注释中)因为它们与这里的想法无关。您需要在自己的代码中添加它们。是的,但我如何知道哪个承诺已解析,并将正确的值分配给正确的$scope vars?@JsIsAwesome,因为它们在对象中解析,因此它们被命名,而不是使用数组,您将获得一个具有属性的解析对象,而不是执行
arr[0]
您应该执行的操作可能不符合顺序。
已解决。hunters
已解决。drawOrder
。这个解决方案只是嵌套在
$scope
一个级别中并自动执行。很酷,我在控制台中看到了它。这是非常非常有用的,谢谢@BenjaminGruenbaum,您可以使用
$q.all([null,noNullPromise])