从使用$ resource的Service返回新对象

时间:2014-11-20 04:24:56

标签: javascript ajax angularjs

我正在努力使我现有的代码更好一点,我希望有两个对象可以与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

因此在控制器恢复执行后创建工厂。我在这做错了什么?

2 个答案:

答案 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();
    });
}]);