Javascript AngularJS 1.2.19从嵌套的$resource服务返回值
我对angularJS还相当陌生,但我正在结束一个项目,并试图通过将大量业务逻辑从我的控制器移动到一个服务调用中来清理一些代码 目前,我的三个工厂服务($resource)调用了所有正确的工作,结果被合并到控制器中。但是我没有运气将所有这些逻辑移动到服务调用中并返回组合对象,即数组 以下是我的项目的简化版本:Javascript AngularJS 1.2.19从嵌套的$resource服务返回值,javascript,angularjs,angularjs-service,angularjs-resource,Javascript,Angularjs,Angularjs Service,Angularjs Resource,我对angularJS还相当陌生,但我正在结束一个项目,并试图通过将大量业务逻辑从我的控制器移动到一个服务调用中来清理一些代码 目前,我的三个工厂服务($resource)调用了所有正确的工作,结果被合并到控制器中。但是我没有运气将所有这些逻辑移动到服务调用中并返回组合对象,即数组 以下是我的项目的简化版本: var Myservices = angular.module('Myapp'); Myservices.factory('ResourceA', ['$resource', funct
var Myservices = angular.module('Myapp');
Myservices.factory('ResourceA', ['$resource',
function($resource) {
return $resource('/api/resourcea');
}
]);
Myservices.factory('ResourceB', ['$resource',
function($resource) {
return $resource('/api/resourceb');
}
]);
Myservices.factory('ResourceC', ['$resource',
function($resource) {
return $resource('/api/resourcec');
}
]);
Myservices.factory('Results', ['ResourceA', 'ResourceB', 'ResourceC',
function (ResourceA, ResourceB, ResourceC) {
var resourcea, resourceb, resourcec;
var results = [];
return {
get: function() {
ResourceB.query().$promise.then(function(data) { // these calls all work
resourceb = data;
});
ResourceC.query().$promise.then(function(data) {
resourcec = data;
});
ResourceA.query().$promise.then(function(data) {
resourcea = data;
// other code here combines above resource calls and
// populates results[] array successfully ...
//
return results; // this is loaded correctly, but I can't return it
});
}
}
}]);
在调试过程中,我确实在“results”中有一个结果数组
现在回到我的控制器中,我有以下代码(为了您的阅读乐趣而简化):
正如你所看到的,我已经开始诉诸于“尝试和错误”,后者比我想要的更多。我显然错过了什么,但我觉得我很接近
提前感谢您的建议
干杯,
Dan不清楚如何组合来自
ResourceA.query()
、ResourceB.query()
和ResourceC.query()
的结果,但这种方法可能不正确,因为数据是异步获取的,而您似乎试图同步组合它们。此外,您不能调用
Results.query()
,因为没有这样的方法
您需要异步组合A、B、C结果。这也意味着您不能从
results.get()
方法返回results
。您需要返回一个承诺,一旦数据被提取和组合,该承诺就会得到解决
您可以使用将多个承诺组合成一个
例如:
然后,您可以在控制器中使用它,如下所示:
Myapp.controller('MyCtrl', function ($scope, $http, $log, Results) {
...
Results.get().then(function (results) {
$scope.results = results;
$log.info(results);
});
});
由于您的服务已经在处理承诺,请尝试在没有承诺回调的情况下调用结果。get(函数(数据){$log.info('Results:'+data);}谢谢Ara-我给了你一个提示,因为这解决了我遇到的错误,并实际返回到控制器。虽然由于我的代码中的其他缺陷,结果集是空的。我将接受下面的答案,因为它使我能够理解并使事情顺利进行。我也感谢你的帮助。np,我打算建议takin下面提到的另一种方法是$q.all,但在您解决回调错误之前,我不想增加更多的复杂性。g'luck.thanking“ExpertSystem”-这让我非常接近,并真正帮助我理解$q和$Promissions。我意识到,概括我的示例会让我很难理解。单个查询的结果组合成一个新数组,其中包含大部分dataA,然后逻辑上加入了额外的dataB和dataC位。我最后的“结果”数组实际上是一个数组数组。上面的新数组,以及dataB和dataC数组。我将这些都推到了结果[]我很乐意去做。我回到控制器后就把它们分了回去。非常感谢您的帮助。您的回答中有一个问题,我收到了上面resultsPromise的.error部分的错误。错误状态为“Object不支持属性或方法'error'”。我用:.then(函数(数据))解决了这个问题{//success logic},函数(error){//handle这个错误$log.error=error;});@djmarquette:oops!我的意思是
.catch(…)
而不是。error(…)
(error
特定于$http
返回的承诺)。我更新了我的答案-thx以供提醒。简要说明:使用.catch()
还有一个额外的好处,即它还将捕获成功回调中的错误(而您的方法不会)。成功回调中很少出现错误,但最好是安全的:)
Myservices.factory('Results', function ($q, ResourceA, ResourceB, ResourceC) {
var results = [];
return {
get: function () {
var dataA = ResourceA.query();
var dataB = ResourceB.query();
var dataC = ResourceC.query();
var resultsPromise = $q.all({
a: dataA.$promise,
b: dataB.$promise,
c: dataC.$promise
}).then(function (data) {
var results = [].concat(dataA).concat(dataB).concat(dataC);
return results;
}).catch(function (error) {/* Handle the error... */});
return resultsPromise;
}
};
});
Myapp.controller('MyCtrl', function ($scope, $http, $log, Results) {
...
Results.get().then(function (results) {
$scope.results = results;
$log.info(results);
});
});