在angularjs中,.service()和.factory()提供程序调用之间是否存在差异?

时间:2015-03-09 20:34:20

标签: angularjs

这个answer(和许多其他人)指出.factory和.service是提供者()功能的不同便利功能。

但是,我没有看到.service()和.factory()调用之间有任何区别(即:下面的测试通过)。有人能帮助我理解我所缺少的东西。感谢

angular.module('myMod', [])
  .service('myService', function() {
    return function() {return 33};
  })
  .factory('myFactory', function() {
    return function() {return 33};
  });

describe('my app tests', function() {

  beforeEach(module('myMod'));

  it('services should work', inject(function(myService) {
    expect(myService()).to.equal(33);
  }));

  it('factories should work', inject(function(myFactory) {
    expect(myFactory()).to.equal(33);
  }));

});

1 个答案:

答案 0 :(得分:2)

.factory用于注册一个函数,该函数返回将作为注入的服务单例的对象的实例。

.service用于注册一个函数,该函数将用作将作为注入服务单例的对象的构造函数。

.service实际上使用了.factory。来自src

function service(name, constructor) {
  return factory(name, ['$injector', function($injector) {
    return $injector.instantiate(constructor);
  }]);
}

换句话说,.service注册了一个工厂函数,该函数在$injector.instantiate注册的函数(上面称为constructor)上调用.service

现在,根据您的情况,您注册的功能是:

var fn = function(){ return function(){ return 13; }; }

fn只返回一个对象(恰好是另一个函数)。

.factory案例中,直接调用fnvar svc = fn();

.service情况下,fn被称为构造函数,但最终没有在this上设置任何内容并返回一个对象(构造函数可以返回与{{1}不同的实例}) - 与上面相同的功能对象。所以,this

在这两种情况下,var svc = $injector.instantiate(fn)等于函数对象:svc