Javascript 服务是提供者的子集,还是不是?

Javascript 服务是提供者的子集,还是不是?,javascript,angularjs,Javascript,Angularjs,2015年4月编辑 到目前为止,我得到的答案解释了服务/工厂/和供应商之间的区别,但这并没有真正理解我所困惑的。AngularJS文档断言,这三个代码本质上是“引擎盖下”相同的代码。但如果是这样,为什么我只能将“提供者”传递到配置块中,而不是“工厂” 原始问题: 根据报告: 最详细、也是最全面的一个是提供者 配方其余四种配方类型-价值、工厂、服务和 常量-只是提供程序配方上的语法糖 这给我的印象是,所有服务都是提供者。但我目前在应用程序的配置块中使用$window服务时遇到了一个问题,我遇到了以

2015年4月编辑 到目前为止,我得到的答案解释了服务/工厂/和供应商之间的区别,但这并没有真正理解我所困惑的。AngularJS文档断言,这三个代码本质上是“引擎盖下”相同的代码。但如果是这样,为什么我只能将“提供者”传递到配置块中,而不是“工厂”

原始问题:

根据报告:

最详细、也是最全面的一个是提供者 配方其余四种配方类型-价值、工厂、服务和 常量-只是提供程序配方上的语法糖

这给我的印象是,所有服务都是提供者。但我目前在应用程序的配置块中使用$window服务时遇到了一个问题,我遇到了以下文档:

模块是配置和运行块的集合,这些块 在引导过程中应用于应用程序。在其 最简单的形式模块由两种 区块:

  • 配置块-在提供程序注册和配置阶段执行仅提供程序和 可以将常量注入到配置块中。这是为了 防止服务在启动之前意外实例化 完全配置。

这意味着提供者和服务之间存在着区别,这比服务配方更为基本,服务配方只是“语法糖”,而不是提供者配方。怎么回事?

基本上发生的是

当您创建一个
factory()
时,它会将第二个参数中提供的函数设置为提供程序的$get并返回它(
provider(name,{$get:factoryFn})
),您得到的只是提供程序,但除了该提供程序的$get之外,没有其他属性/方法(意味着您无法配置它)

工厂来源

function factory(name, factoryFn, enforce) {
    return provider(name, {
      $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
    });
  }
当创建
服务()
时,它返回您提供的带有注入构造函数的函数的工厂()(返回您在服务中提供的构造函数的实例)并返回它

服务的源代码

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

因此,基本上在这两种情况下,您最终都会为您提供的函数设置一个providers$get,但您可以提供$get以外的任何内容,正如您最初在provider()中为配置块提供的那样一个
提供程序是一个通过其
$get
方法实例化服务的提供程序。提供程序用于在模块的
config
阶段中可用,从而在应用程序运行之前配置服务

服务只是一个注入的单例。您可以通过以下方式定义服务:

  • 调用
    myModule.service('serviceName',ServiceConstructor)
    ,其中
    ServiceConstructor
    是您通常使用的
    new
    构造函数
  • 调用
    myModule.factory('serviceName',factoryFunction)
    ,其中
    factoryFunction
    是一个返回服务实例的函数
  • 调用
    myModule.value('serviceName',serviceInstance)
    ,其中
    serviceInstance
    是将被注入的实际对象
  • 调用
    myModule.provider('serviceName',serviceProvider)
    ,其中
    serviceProvider
    是具有返回服务实例的
    $get
    方法的某个对象

关键是服务是实例。如果使用“提供者配方”(第四个项目符号)定义服务,是否允许将其注入配置块?可以将提供者注入配置块,但不能将服务本身注入。