我正在努力使我现有的代码更好一点,我希望有两个对象可以与RESTful API进行交互。
以前,我使用$ http来获取数据并返回承诺。然后我会对它采取一些行动。然后我会重新询问获取其他数据并重复它。所以有几个嵌套的$ http查询。如果可能的话,我想避免这种情况。
我想有一个服务(或工厂),我可以用来配置各种查询参数和另一个对象来按摩和输出响应。
这是我到目前为止所做的:
var solr1 = angular.module('solr', ['ngResource']);
solr1.run(function(){
console.log("Module Loaded");
});
solr1.service('solrser', function($resource,solrresult) {
console.log("In Solrser")
this.serverurl = 'url';
this.res = $resource(this.serverurl);
this.query = function (p) {
this.res.get(p).$promise.then(function(d) {
return solrresult(d);
});
}
});
solr1.factory('solrresult',function() {
return function(a) {
this.data = a;
this.ready = 0;
console.log("In Factory")
this.getdocs = function() {
console.log("Getting Data")
console.log(this.data);
return this.data.docs; //this is line 9
}
return this;
}});
控制器看起来像这样:
app.controller('app1cont', ['$scope', 'solrser', 'solrresult', function($scope,solrser,solrresult){
console.log("Start");
var res = solrser.query({'q':'potato'});
console.log(res)
console.log(res.getdocs())
}]);
输出如下:
Module Loaded solr_module.js:5
In Solrser solr_module.js:9
Start main_controller.js:6
undefined main_controller.js:9
TypeError: Cannot read property 'getdocs' of undefined
at new <anonymous> (.........../main_controller.js:10:21)
at Object.e [as invoke] (https://code.angularjs.org/1.3.1/angular.min.js:36:365)
at F.instance (https://code.angularjs.org/1.3.1/angular.min.js:75:91)
at https://code.angularjs.org/1.3.1/angular.min.js:58:287
at s (https://code.angularjs.org/1.3.1/angular.min.js:7:408)
at G (https://code.angularjs.org/1.3.1/angular.min.js:58:270)
at g (https://code.angularjs.org/1.3.1/angular.min.js:51:172)
at g (https://code.angularjs.org/1.3.1/angular.min.js:51:189)
at https://code.angularjs.org/1.3.1/angular.min.js:50:280
at https://code.angularjs.org/1.3.1/angular.min.js:18:8 angular.js:11339
In Factory solr_module.js:25
因此在控制器恢复执行后创建工厂。我在这做错了什么?
答案 0 :(得分:0)
我看到缺少分号
console.log("In Solrser")
应该
console.log("In Solrser");
这里也缺少分号
console.log("Getting Data")
console.log("In Factory")
在控制器中你也丢失了分号。 我认为这是您的代码无法正常工作的原因。
为了避免缺少分号等错误,您可以在IDE中使用JSHint插件
答案 1 :(得分:0)
你有时间问题。
app.controller('app1cont', ['$scope', 'solrser', 'solrresult', function($scope,solrser,solrresult){
console.log("Start");
var res = solrser.query({'q':'potato'});
console.log(res)
console.log(res.getdocs())
}]);
当您致电solrser.query()
时,它会运行 async 来获取数据。因此,在res
服务中的promise返回之前,"solrser"
不会填充任何实际值。你需要做更多的事情:
solrser.query({'q':'potato'},function(res) {
console.log(res);
console.log(res.getdocs());
}); // could be done as a promise as well....
另外,当你在solrser
服务中调用响应时,你也会做一些非常奇怪的事情。
this.query = function (p) {
this.res.get(p).$promise.then(function(d) {
return solrresult(d);
});
}
在promise处理程序中调用return
对你不太重要。您需要调用回调或解决延迟。这样的事情会更好:
this.query = function (p,callback) {
this.res.get(p).$promise.then(function(d) {
callback(solrresult(d));
});
}
或作为承诺
this.query = function (p) {
var defer = $q.defer();
this.res.get(p).$promise.then(function(d) {
defer.resolve(solrresult(d));
});
return defer.promise;
}
或者你可以通过get(p).$promise
通过,等等。
更新:
由于这是异步操作,因此始终会有promise或callback。您必须执行以下操作之一:
app.controller('app1cont', ['$scope', 'solrser', 'solrresult', function($scope,solrser,solrresult){
var res = solrser.query({'q':'potato'},function() {
res.getDocs();
});
}]);
或者只是直接回调
app.controller('app1cont', ['$scope', 'solrser', 'solrresult', function($scope,solrser,solrresult){
solrser.query({'q':'potato'},function(res) {
res.getDocs();
});
}]);