Как проверить, является ли возвращаемое значение в сервисе angularjs обещанием?

У меня много проблем с предположением, как на самом деле проверить, является ли возвращаемое значение функции обещанием. Я использую 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 должен возвращать обещание, как я могу проверить это, если возвращаемое значение на самом деле является обещанием?


person Nico    schedule 03.10.2015    source источник
comment
У обещаний есть then метод, не так ли?   -  person Edwin Dalorzo    schedule 03.10.2015


Ответы (3)


(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

person Alvaro Joao    schedule 03.10.2015
comment
Пробовал что-то подобное, но обещание не определено - person Nico; 03.10.2015
comment
вы все равно можете использовать construtor.name вернет псевдоним для defer () github.com/angular/angular.js/blob/master/src/ng/q.js#L3 - person Alvaro Joao; 03.10.2015

Вы можете использовать $ q.when, чтобы обернуть объект как обещание (независимо от того, есть он или нет). Тогда вы можете быть уверены, что всегда имеете дело с обещанием. Это должно упростить код, который затем обрабатывает результат.

Документация для $ q.when здесь с $ q.

person Bhushankumar Lilapara    schedule 03.10.2015

Во-первых, нет необходимости проверять, что возвращаемое значение функции является обещанной.

Проверка конструктора объекта - очень плохая идея. Предположим, что разработчики angular меняют структуру обещания (и его название). Итак, ваш код устарел. Лучше использовать Angular API (который считается стабильным).

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

Однако этот метод нельзя использовать в тестах.

person Mostafa    schedule 01.06.2017