我试图用Angular $资源链接一个承诺。
我有以下工厂:
angular.module('myApp').factory('Product', ['$resource', function ($resource) {
return $resource(
'/api/product/:name',
{ name: '@name' },
{ 'getSub': {
url: '/api/product/getSub/:name',
method: 'GET'}
}
);
}]);
我使用我的产品工厂进行多次查询:
Product.query({'name': name}, function(product) {
Product.getSub({'name': product.name}, function(subItem) {
Product.getSub({'name':subItem.name}, function(childItem) {
//do stuff with child item
})
})
})
有更好的方法吗?我觉得嵌套所有这些电话不是最好的做法。
答案 0 :(得分:2)
你可以将承诺链接在一起!
Product.query({'name': name}).$promise
.then(function(product){
return Product.getSub({'name': product.name}).$promise;
})
.then(function(subItem){
return Product.getSub({'name': subItem.name}).$promise;
})
.then(function(item){
// etc
})
答案 1 :(得分:1)
您可以使用async library的瀑布或自行实施 这是您案例的示例代码。
async.waterfall([
function(callback) {
Product.query({'name': name}, function(product) {
callback(null, product);
})
},
function(product, callback) {
Product.getSub({'name': product.name}, function(subItem) {
callback(null, product, subItem);
})
},
function(product, subItem, callback) {
Product.getSub({'name':subItem.name}, function(childItem) {
var result = {};
result.childItem = childItem;
result.subItem = subItem;
result.product = product;
callback(null, result);
})
}
], function (err, result) {
//do stuff with result
});
答案 2 :(得分:0)
如果您希望一个接一个地完成请求(就像您的示例中那样),您可以执行这样的递归函数:
在这个例子中我想上传几张图片(调用http路线):
$scope.uploadImageLayout = function (currentIndex, numberOfItems) {
if (currentIndex === numberOfItems) {
// in here you could do some last code after everything is done
} else {
Upload.upload({
url: 'localhost:3000/ficheiros',
file: $scope.imagesToUpload[$scope.auxIndex].file
}).success(function (data, status, headers, config) {
if ($scope.auxIndex < numberOfItems) {
$scope.uploadImageLayout(currentIndex + 1, numberOfItems);
}
});
}
};
第一次打电话时就这样做了:
$scope.uploadImageLayout(0, $scope.imagesToUpload.length);
在你的情况下它是相同的,但是你应该得到你的请求而不是Upload.upload请求并捕获回调函数。