javascript - 交替使用 Angular 工厂和服务——没有错误

标签 javascript angularjs angularjs-service

我正在使用一个服务,那里应该有一个工厂,但我没有收到错误。 我的服务在应该返回构造函数时返回了对象。
但我的代码运行完美。

例如,下面的代码应该不起作用。但它工作正常:

angular.module('myApp', [])
    .service('myService', myService);

function myService(/*<dependencies go in here>*/){
   return {
     /*<object attributes in here>*/
   }
}

正确的代码应该是这样的:

angular.module('myApp', [])
    .factory('myService', myService);

function myService(/*<dependencies go in here>*/){
   return {
     /*<object attributes in here>*/
   }
}

我的问题是为什么当你实际返回一个对象并且应该使用 .factory 时,angular 允许你使用 .service

最佳答案

好的,这就是我对这个有趣问题的回答。

首先让我们确保我们了解服务和工厂之间的主要区别,在我们看到这两种实现之后会更容易:

工厂:

function factory(name, factoryFn) {
    return provider(name, { $get: factoryFn });
}

服务:

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

正如我们所见,工厂实际上正在做的是让我们获得工厂函数返回的对象。

另一方面,服务使用我们提供的构造函数实例化一个新对象。不用说都是单例。

在你上面的例子中,工厂的使用就像它应该的那样,这是最佳实践。 我想有趣的部分是为什么服务在工作时他的构造函数并没有真正定义类但也返回一个对象。

棘手的部分来了,它之所以有效,是因为如前所述,使用服务实际上实例化了一个对象,在我们的不良实践中,我们用新的构造函数覆盖了默认构造函数。

听起来很困惑?这是一个Fiddle执行基本相同的事情,我们使用 new ConstructorFunc() 而 ConstructorFunc() 不是定义一个对象,而是使用 this.prop=something 创建它的属性返回一个对象。

也许这不是最佳做法,但它是可能的。 我认为我们最好像过去一样继续使用服务来遵循惯例。

有趣的文章factory vs service vs provider

关于javascript - 交替使用 Angular 工厂和服务——没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28545420/

相关文章:

javascript - 在 NodeJS 中需要一个异步函数

javascript - 如何使用 angularjs 和 ui-router 正确显示页眉/页脚?

javascript - AngularJS 工厂 $rootScope.$on 清理

javascript - AngularJS 服务获取数据,但不将其返回给 Controller ?

angularjs - ngSanitize 不允许允许 id 属性

angularjs - 有人可以提供 AngularJS 中 $controller 服务的用例吗?

javascript - C# - 从代码隐藏中添加 javascript 函数

javascript - 如何使用 Laravel 5.4 和 Vue.js 2 正确存储 JWT token

javascript - 如何打开文件对象(HTML)并在谷歌应用程序脚本中解析它

javascript - Angular JS 方法未使用 Wcf 服务定义