如何检查 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
});
怎么这个方法在测试中不能用
我在猜测如何实际检查函数的 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
});
怎么这个方法在测试中不能用