Javascript 所有动态结果的角度q
在做某事之前,我需要等待两个承诺的解决。问题是,有时我只能根据客户的需求发送一个承诺,我需要依靠这$q.all的结果。如何动态定义变量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 = $
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])