如何检查 angularjs 服务中的返回值是否是一个承诺?

How to check if returned value in an angularjs service is a promise?

我在猜测如何实际检查函数的 returned 值是否是一个 promise 时遇到了很多麻烦。我将 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 方法应该 return 一个承诺,我如何测试 returned 值是否实际上是一个承诺?

(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

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

$q.when 的文档在此处与 $q.

首先,没有必要检查 return 函数的值是 promis。

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

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

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