Angular Service Definition: service or factory

angularjs, angularjs-service

Solution

you have two big problems there:

- the factory returns an object with incorrect syntax.

- javascript scope of variables is functional

That is, You should be returning an object like `{key: value, key: value}`

values can be functions. however, you return `{key = value, key = value}`

First fix:

return { 
    getSomething : function() {...},
    getData : function... 
}

Secondly, not being able to call functions is normal. See this jsfiddle. I mocked everything. You can call one of the functions returned by the service. However, when from getSomething try to call getData, you get "undefined":

app.factory('testSO', function () {
return {
    getSomething: function () {
        console.log('return getsomething');
        getData();
    },

    getData: function () {
        console.log('return getData');
    }...

This would be the same as declaring everything in the scope of the factory function and return references see in jsfiddle:

app.factory('testSO', function () {
    var getSomething = function () {
        console.log('return getsomething');
    };
    ...
return {
    getSomething: getSomething,
    ...
}

and now you can call local functions as shown in the final version of the jsfiddle:

app.factory('testSO', function () {
    var getSomething = function () {
        console.log('return getsomething');
        getData();
    };
...

The original service has something important in it: `var self = this;` . Some people use var that = this. It's a workaround for an error in ECMA. In the case of the original code, it's used to "put everything in one object". Functions (properties that happen to be functions) in `self` need a reference to know where the function you want to call is. Try it yourself here http://jsfiddle.net/Z2MVt/7/

Problem

I am an angular newbie, I am building an application, one thing really puzzling me is there are couple of ways of defining a service, and I read more from this link: How to define service then it seems there is no big difference among the ways of defining a service. but I just noticed one difference which I think is different: see this service I get from here http://jsfiddle.net/2by3X/5/ ``` var app = angular.module('myApp', []); app.service('test', function($timeout, $q) { var self = this; this.getSomething = function() { return self.getData().then(function(data) { return self.compactData(data); }); }; this.getData = function() { var deferred = $q.defer(); $timeout(function() { deferred.resolve("foo"); }, 2000); return deferred.promise; }; this.compactData = function(data) { var deferred = $q.defer(); console.log(data); $timeout(function() { deferred.resolve("bar"); }, 2000); return deferred.promise; }; }); ``` if I define this service using "factory" like below, one function cannot call other functions of the service. ``` app.factory('test', function($timeout, $q) { return { getSomething : function() { return getData().then(function(data) { return compactData(data); }); }, getData : function() { var deferred = $q.defer(); $timeout(function() { deferred.resolve("foo"); }, 2000); return deferred.promise; }, compactData : function(data) { var deferred = $q.defer(); console.log(data); $timeout(function() { deferred.resolve("bar"); }, 2000); return deferred.promise; }, }; }); ``` I will get this in the browser console: ``` [08:41:13.701] "Error: getData is not defined .getSomething@http://fiddle.jshell.net/_display/:47 Ctrl1@http://fiddle.jshell.net/_display/:75 invoke@http://code.angularjs.org/1.0.0/angular-1.0.0.js:2795 instantiate@http://code.angularjs.org/1.0.0/angular-1.0.0.js:2805 ``` Can anyone explain this? thanks.

Original source