当前位置: 首页 > 面试题库 >

角度服务定义:服务或工厂

冀胤运
2023-03-14
问题内容

我是一个有角的新手,正在构建一个应用程序,让我感到困惑的是,有几种方法定义了服务,我从此链接中了解了更多:如何定义服务, 然后似乎没有太大的区别定义服务的方式。

但我只是注意到我认为是不同的一个不同之处:

看到我从这里得到的这项服务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;
  };
});

如果我使用如下所示的“工厂”定义此服务,则一个功能不能调用该服务的其他功能。

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;
  },
 };
});

我将在浏览器控制台中获得此信息:

[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

有人可以解释吗?谢谢。


问题答案:

那里有两个大问题:

  • 工厂返回的语法错误的对象。
  • javascript变量作用域有效

也就是说,您应该返回一个类似 {key: value, key: value}

值可以是函数。但是,你回来{key = value, key = value}

首先解决:

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

其次,不能调用函数是正常的。看到这个jsfiddle。我嘲笑了一切。您可以调用服务返回的功能之一。但是,当从getSomething尝试调用getData时,将得到“未定义”:

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

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

这与声明工厂函数范围内的所有内容并返回参考参见jsfiddle相同:

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

现在您可以调用本地函数,如jsfiddle的最终版本所示:

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

原始服务中有一些重要的内容:var self = this;。有些人使用 var that =
this
。这是ECMA错误的解决方法。在原始代码的情况下,它用于“将所有内容放入一个对象中”。self需要参考的函数(恰好是函数的属性)
知道您要调用的函数在哪里。在这里尝试一下http://jsfiddle.net/Z2MVt/7/



 类似资料:
  • 问题内容: 我已经看到angular.factory()和angular.service()都用于声明服务;但是,我在官方文档中找不到 任何地方。 两种方法有什么区别? 应该使用哪个(假设他们做不同的事情)? 问题答案: 直到我以这种方式对自己说: 服务 :您编写的 函数 将是 新的 -ed: Factory* :将 调用 您编写的 函数 (构造函数): * 您可以根据自己的意愿进行操作,但是有一

  • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Defining Services 一节 如果想在RPC (Remote Procedure Call) 系统中使用消息类型, 可以在.proto文件中定义RPC服务接口, 然后protocol buffer编译器会生成所选语言的服务接口代码和桩(stubs). 因此, 例如, 如果想定义一个RPC服务,带一个方法处理S

  • 我正在使用云形成和yaml语法设置AWS ECS服务。 在某个时候,在相关的留档中有一个名为的属性,其定义如下: 角色 AWS标识和访问管理(IAM)角色的名称或ARN,该角色允许Amazon ECS容器代理调用负载平衡器。 注意:在某些情况下,可能需要添加对服务角色策略的依赖关系。有关详细信息,请参阅DependsOn属性中的IAM角色策略。必需:无类型:字符串更新需要:替换 由于我打算将特定服

  • 我正在尝试将服务人员添加到现有的angular(5.2,CLI 1.7.1)应用程序中。我做了我应该做的一切: > 我甚至尝试将这段代码(我在某处找到了解决方案)添加到main。ts 但我有一个错误: 未捕获(promise中)DOMExc0019:注册ServiceWorker失败:脚本具有不受支持的MIME类型('text/html')。 错误:未捕获(promise中):安全错误:注册Ser

  • 我有一个Spring启动应用程序,我正在尝试连接到DB2服务。但是我没有服务连接创建者异常,因为枢轴云代工支持Mongo db和其他一些db。有人能告诉我如何在DB2服务的Spring启动应用程序中编写自定义服务连接器吗?

  • 本文向大家介绍Android 定义服务流程,包括了Android 定义服务流程的使用技巧和注意事项,需要的朋友参考一下 示例 该android:process字段定义了要在其中运行服务的进程的名称。通常,应用程序的所有组件都在为该应用程序创建的默认进程中运行。但是,组件可以使用其自己的进程属性覆盖默认值,从而使您可以将应用程序分布在多个进程中。 如果分配给该属性的名称以冒号(':')开头,则该服务