Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angularjs中的.service()和.factory()提供程序调用之间有区别吗?_Angularjs - Fatal编程技术网

angularjs中的.service()和.factory()提供程序调用之间有区别吗?

angularjs中的.service()和.factory()提供程序调用之间有区别吗?,angularjs,Angularjs,这(以及其他许多)指出,.factory和.service是不同于provider()功能的便利函数 但是,我看不出.service()和.factory()调用之间有任何区别(即:下面的测试通过)。有人能帮我理解我错过了什么吗。谢谢 angular.module('myMod', []) .service('myService', function() { return function() {return 33}; }) .factory('myFactory', fun

这(以及其他许多)指出,.factory和.service是不同于provider()功能的便利函数

但是,我看不出.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);
  }));

});

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

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

.service
实际上在封面下使用了
.factory
。发件人:

换句话说,
.service
注册一个调用
$injector的工厂函数。在注册到
.service
的函数(上面称为
构造函数
)上实例化

现在,对于您的情况,您注册的函数是:

var fn = function(){ return function(){ return 13; }; }
fn
只返回一个对象(恰好是另一个函数)

.factory
情况下,直接调用
fn
var svc=fn()

.service
的情况下,
fn
像构造函数一样被调用,但最终没有在
这个
上设置任何内容并返回一个对象(构造函数可以返回一个与
这个
不同的实例)-与上面相同的函数对象。因此,
var svc=$injector.instantiate(fn)


在这两种情况下,
svc
都等于一个函数对象:
function(){return 13;}

您似乎可以返回一个工厂函数或一个新的可启用函数。。但我想说的是:.service()调用的工作方式与.factory()调用的工作方式似乎没有任何实际区别。我将删除另一个注释上的结束语,这是对这个问题的极端看法:这个博客作者似乎误解了
.service
.factory
.provider
的使用。到目前为止,我的理解是:*您可以在许多地方注入服务;每个都是相同的实例。服务不可参数化。*工厂是可参数化的,设计用于创建多个实例;控制器提供程序是工厂的示例。使用工厂时必须使用新的X()。
var fn = function(){ return function(){ return 13; }; }