【问题标题】:How to check if returned value in an angularjs service is a promise?如何检查 angularjs 服务中的返回值是否是一个承诺?
【发布时间】:2015-10-03 18:53:52
【问题描述】:

我在猜测如何实际检查函数的返回值是否是一个承诺时遇到了很多麻烦。我将 Jasmine 与 Karma 和 angularjs 一起使用。我做了一个服务:

var app = angular.module('myService', []);

function simpleResource ($q) {

   this.cget = function () {
     var deferred = $q.defer();

     return deferred.promise;
   };

   this.get = function () {
     // body...
   };

   this.save = function () {
     // body...
   };

   this.delete = function () {
     // body...
   };
}

app
  .service('nsResource', simpleResource);

如您所见,cget 方法应该返回一个承诺,如果返回的值实际上是一个承诺,我该如何测试?

【问题讨论】:

  • Promise 有一个then 方法,不是吗?

标签: javascript angularjs jasmine karma-runner


【解决方案1】:

(function(angular) {
  'use strict';
  angular.module('includeExample', ['ngAnimate'])
    .controller('ExampleController', ['$scope', '$q',
      function($scope, $q) {


        $scope.a = "";
       
        $scope.asyncGreet = function(name) {
          var deferred = $q.defer();

            deferred.notify('About to greet ' + name + '.');
            if (true) {
              deferred.resolve('Hello, ' + name + '!');
            } else {
              deferred.reject('Greeting ' + name + ' is not allowed.');
            }

          return deferred.promise;
        };
        $scope.promise = $scope.asyncGreet('Robin Hood');
        $scope.a = $scope.promise.constructor.name;

       

      }
    ]);
})(window.angular);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-beta.1/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-beta.1/angular-animate.js"></script>

<body ng-app="includeExample">
  <div ng-controller="ExampleController">

    <div class="slide-animate-container">
      <span ng-bind="a"><span>
      
    </div>
  </div>
</body>

您可以使用constructor:

deferred.promise.constructor == Promise

【讨论】:

【解决方案2】:

您可以使用 $q.when 将对象包装为承诺(无论是否)。然后,你可以确定你总是在处理一个承诺。这应该会简化处理结果的代码。

$q.when 的文档与 $q 一起在这里。

【讨论】:

    【解决方案3】:

    首先不需要检查函数的返回值是否为promis。

    检查对象构造函数是一个非常糟糕的主意。假设 Angular 开发人员更改了 Promise 结构(及其名称)。所以你的代码已经过时了。最好使用 Angular API(它被认为是稳定的)。

    var value = callFunction();
    $q.when(value)
    .then(function(){
      // doing some thing
    });

    这个方法怎么在测试中不可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 2020-02-27
      • 1970-01-01
      • 2021-02-22
      • 2022-01-16
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多