Reputation: 1729
I'm making a directive that takes a function as a scope parameter (scope: { method:'&theFunction' }
). I need to know if the result returned by that method is an angular promise (if yes something will happen on resolution, otherwise it happens right away).
For now I'm testing if foo.then
exists but I was wondering if there was a better way to do it.
Upvotes: 60
Views: 20042
Reputation: 1020
The $q.when()
answer seems like the best answer for most use cases, I used instanceof for mine.
if(buttonData instanceof $q) {
buttonData.then(function(actions) {
$scope.buttonActions = actions;
});
} else {
$scope.button = buttonData;
}
Alternatively, the following IF worked as well, but I ended up going with the above solution.
if(Object.getPrototypeOf(buttonData) === $q.prototype) {
Upvotes: 0
Reputation: 1813
@kayakDave, thanks for guiding to right place.
when(value, [successCallback], [errorCallback], [progressCallback]); Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. This is useful when you are dealing with an object that might or might not be a promise, or if the promise comes from a source that can't be trusted.
$q.when(value).then(function (data) {
//this helps me to bind data from $resource or $http or object
}
check this fiddle
Upvotes: 5
Reputation: 24676
Angular's when()
is a good option as Davin mentioned.
If that doesn't meet your needs then Angular's internal way of checking (it uses this inside when
) is very close to what you're doing:
var ref = function(value) {
if (value && isFunction(value.then)) {
// Then this is promise
}
Upvotes: 81
Reputation: 67316
You can use $q.when
to wrap the object as a promise (whether it is or not). Then, you can be sure that you are always dealing with a promise. This should simplify the code that then handles the result.
Documentation for $q.when
is here with $q.
Upvotes: 82