有什么方法可以知道变量是否是angularjs的承诺?

时间:2013-12-21 21:27:30

标签: angularjs

我正在制作一个将函数作为范围参数(scope: { method:'&theFunction' })的指令。我需要知道该方法返回的结果是否是一个有角度的承诺(如果有的话会在分辨率上发生,否则会立即发生)。

目前我正在测试foo.then是否存在,但我想知道是否有更好的方法。

4 个答案:

答案 0 :(得分:82)

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

$q.when的文档为here with $q

答案 1 :(得分:78)

当Davin提到时,Angular的when()是一个不错的选择。

如果这不符合您的需求,那么Angular的internal way of checking(它在when内使用它)与您正在做的非常接近:

var ref = function(value) {
   if (value && isFunction(value.then)) {
      // Then this is promise
   }

答案 2 :(得分:5)

@kayakDave,感谢您指导正确的地方。

angular $q

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
}

检查此fiddle

答案 3 :(得分:0)

对于大多数用例来说,$q.when()的答案似乎是最好的答案,我为我使用了 instanceof

    if(buttonData instanceof $q) {
        buttonData.then(function(actions) {
            $scope.buttonActions = actions;
        });
    } else {
        $scope.button = buttonData;
    }

或者,以下 IF 也可以,但是我最终还是采用了上述解决方案。

if(Object.getPrototypeOf(buttonData) === $q.prototype) {